2013-10-31 35 views
1

我正在通过网络传输文件。传输过程中的数据丢失容忍度为零。我被要求计算原始文件和复制文件的SHA256值,以验证内容是否相同。到目前为止,我已经基于复制和粘贴文件进行了比较,并让Windows使用-copy附加到文件名来重命名该文件。我也尝试在重命名上面重命名文件,以及删除文件扩展名。到目前为止,他们都产生相同的散列。我也编写了改变文件属性(只是改变了lastWrittenTime和fileCreationTime),这似乎没有对哈希产生影响。SHA256用于计算散列的文件的哪些部分

Checksum result of copying and pasting a file(explorer appends "-copy to name): 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

Checksum result of renaming the -copy in explorer: 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

Checksum result of changing file extension: 

E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 
E7273D248F191A0F914837A21BE39D229D790CA242D38651BAA06DAC9EBB63F7 

创建散列时使用哪个文件部分?

好吧,零容忍是有点多了,如果散列不匹配的文件将不得不重新发布。

+6

...文件的内容? –

+0

发布你如何计算哈希的代码。 – Paparazzi

+2

@Blam:真的吗? – spender

回答

11

整个二进制文件内容通过散列算法进行流式传输。文件元数据(例如名称,日期等)不起作用。

3

首先,一般建议:不要这样做。使用rsync或类似的东西来做批量文件传输。 Rsync经过多年的优化和调试,拥有无数的选项来控制复制的方式(以及是否),并且可以在Windows上使用。不要浪费时间来构建已经构建的东西。

但是,如果你必须...

散列算法通常关心字节,而不是文件。将SHA256应用于文件时,您只需读取字节并将它们传递给算法即可。

如果你想哈希路径,权限等,你应该在目录级别做这件事,因为这些东西构成了目录的“内容”。目录没有标准的字节级表示,所以你可以自己创建一个。看起来像按照排序顺序列出的目录通常就足够了。并确保每个条目都包含相应内容的散列,无论是文件还是其他目录。这样,目录的散列不仅可以唯一地指定每个子项的名称和属性,还可以递归地指定子目录的全部内容。

注意:相同文件具有相同散列的事实实际上可以对您有利,因为一旦系统意识到具有相同散列的文件已经存在于目的地,就避免传输第二个文件。当然,你必须明确地为此编写代码。但是也要注意,这样做可以在移动或复制文件时允许超便宜的同步,因为它们将具有与以前相同的散列。只有受影响的目录(从直接父目录到根目录)将具有不同的哈希值。

最后,一个小问题:没有零容忍这样的事情。忘记在宇宙的一生中是否会发生SHA256碰撞。伽玛射线可以翻转一下,说:“这两个文件不匹配!”这样的翻转很少发生,但比你想象的要多得多。在嘈杂的量子宇宙中,我们应该避免以绝对的方式说话。

+1

最近你可能会得到一个目录的标准表示,如果目录本身在一个zip文件中。 – cHao

+0

@cHao:这是矫枉过正,并且不能递归地工作。包含每个孩子的散列的简单文本列表足以保证唯一性。但是,无论如何,这意味着+1,因为它让我想起了“小孩哈希”这一点。 –

+0

@MarceloCantos:欣赏细节,零容忍有点多,但如果它们不匹配,我将不得不重新发送文件。 – user2943131