【发布时间】:2017-12-17 22:40:27
【问题描述】:
我们需要服务器中所有上传文件的文件指纹。现在选择 sha256 作为哈希函数。
对于大文件,每个文件被分成几个大小相等的文件块(最后一个除外)进行传输。每个文件块的 sha256 值由客户端提供。它们由服务器重新计算和检查。
但是,这些 sha256 值不能组合成整个文件的 sha256 值。
所以我考虑改变文件指纹的定义:
对于小于 1GB 的文件,sha256 值就是指纹。
对于大于 1GB 的文件,它被分割成 1GB 的块。每个chunk都有自己的sha256值,记为s0,s1,s2(都是整数值)。
当收到第一个块时:
h0 = s0
收到第二个块时
h1 = SHA256(h0 << 256 + s1)
这实质上是连接两个哈希值并再次对其进行哈希处理。重复此过程,直到收到所有块。而最终值hn作为文件指纹。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我用谷歌搜索了很多。并阅读一些关于各种语言或框架的 combine_hash 函数的文章。不同的作者选择了不同的位重整散列函数,据说大部分都运行良好。
然而,就我而言,效率不是问题。但指纹被存储并用作系统范围内的文件内容标识符。
我主要关心的是上面列出的幼稚方法是否会比 sha256 本身引入更多的冲突?
如果在我们的案例中 sha256 不是组合哈希值的好选择,有什么建议吗?
【问题讨论】: