【问题标题】:How do I check if a file is *mostly* identical with another?如何检查一个文件是否*大部分*与另一个文件相同?
【发布时间】:2020-04-30 17:47:34
【问题描述】:

我需要使用 Powershell 检查两个文件是否相同,但有以下限制:前 2K 中有八个 特定 字节允许不同(如果您有兴趣, 它是 ext4 图像的超级块中的某些时间戳字节)。

我在 Stack Overflow(显然)上找到的用于进行 full 检查的代码如下:

$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString(
            $md5.ComputeHash([System.IO.File]::ReadAllBytes("fspec.bin")))

这给了我整个文件的哈希值,但我真正需要的是:

  • 文件的前 2K 作为字节数组,因此我可以检查细节;和
  • 文件余数的校验和以检查相等性。

System.IO.File 类具有 ReadAllBytes,但似乎没有读取文件部分的能力,也没有寻找特定位置的能力。

我尝试读取字节数组并使用数组切片来获取以下部分:

$restOfFile = [System.IO.File]::ReadAllBytes("fspec")
$firstTwoK = $restOfFile[0..2048]
$restOfFile = $restOfFile[2048..$restOfFile.Length]
# Then:
#    1. Check bytes in firstTwoK.
#    2. Check MD5 of all bytes in restOfFile.

不幸的是,它是一个 750M 文件的事实导致了问题:

Array dimensions exceeded supported range.
At C:\testprog\testprog.ps1:42 char:1
+ ${devBytes} = ${devBytes}[2048..${devBytes}.Length]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], OutOfMemoryException
    + FullyQualifiedErrorId : System.OutOfMemoryException

有没有一种实用的方法可以满足我的需要?

【问题讨论】:

标签: powershell


【解决方案1】:

使用System.Security.Cryptography.HashAlgorithm 的一种派生类型并使用其ComputeHash 方法指定偏移量。要检查文件的唯一性,MD5 is still fine to use,但如果您也可以选择使用更强大的算法:

$fileBytes = [System.File.IO]::ReadAllBytes("C:\path\to\file.ext")
$md5Cng = [System.Security.Cryptography.MD5Cng]::Create()
$fileHashAfterOffset = $md5Cng.ComputeHash( $fileBytes, 2KB, $fileBytes.length - 2KB )

ComputeHash 的第一个参数是作为Byte[] 的文件。第二个参数是偏移量(例如,在生成哈希时不包括第一个 x 字节),第三个参数是您要评估的字节数。在这种情况下,我们需要文件的其余部分,因此我们取 $fileBytes 数组中的总字节数并从中减去偏移量。

使用2KB 是获取 2 KB 中字节数的简写。

【讨论】:

  • 这是一个很好的答案。我最终做的(在您发布之前)只是将不相关的字节从一个数组复制到另一个数组,然后对两者进行哈希处理并比较哈希值(只有在所有非复制字节都相同时,它们才会相等,在正常的最小碰撞可能性)。但是我已经对此进行了测试并且它有效,所以我给了你选票。谢谢。
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多