我们需要服务器中所有上传文件的文件指纹。现在,sha256被选为哈希函数。
对于大文件,每个文件被拆分为几个相同大小的文件块(最后一个除外)进行传输。每个文件块的sha256值由客户端提供。它们由服务器重新计算和检查。
但是,这些sha256值不能合并到整个文件的sha256值中。
所以我考虑改变文件指纹的定义:
对于小于1GB的文件,sha256值是指纹。
对于大于1GB的文件,它被切成1GB的块。每个块都有自己的sha256值,表示为s0,s1,s2(均为整数值)。
收到第一块时:
h0 = s0
收到第二块时
h1 = SHA256(h0 << 256 + s1)
这基本上是连接两个哈希值并再次哈希。重复该过程直到收到所有块。最终值hn
用作文件指纹。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我搜索了很多。并阅读有关各种语言或框架的combine_hash函数的一些文章。不同的作者选择不同的位修改哈希函数,并且据说其中大多数都运行良好。
然而,就我而言,效率并不是一个问题。但指纹存储并用作系统范围内的文件内容标识符。
我主要担心的是,如果上面列出的天真方法会比sha256本身引入更多冲突?
如果在我们的案例中sha256不是组合哈希值的好选择,那么有什么建议吗?
答案 0 :(得分:1)
你实质上正在重塑Merkle tree。
您需要做的是将大文件拆分为大小相等的块(没有最后一个片段),为每个块计算散列,然后成对组合它们,直到有一个最终散列值。请注意&#34; root&#34; hash 不会等于原始文件的哈希值,但不需要验证整个文件的完整性。