【发布时间】:2011-06-14 15:15:16
【问题描述】:
我正在制作一个存储文档的应用程序,并根据包括时间戳在内的一些内容的 SHA1 摘要为每个文档提供一个 UID。摘要有很多字符,我想让用户通过使用完整摘要的前 x 个字符来识别文档。如果文档数量可能在 10K - 100K 左右,那么 x 有什么好的价值?
【问题讨论】:
标签: algorithm probability sha1 hmac
我正在制作一个存储文档的应用程序,并根据包括时间戳在内的一些内容的 SHA1 摘要为每个文档提供一个 UID。摘要有很多字符,我想让用户通过使用完整摘要的前 x 个字符来识别文档。如果文档数量可能在 10K - 100K 左右,那么 x 有什么好的价值?
【问题讨论】:
标签: algorithm probability sha1 hmac
调整wikipedia for the Birthday problem 上的公式,您可以将碰撞概率近似为1 - e^(-n^2/(2^(b+1))),其中n 是文档数,b 是位数。 Graphing this formula with n=100,000,看起来您至少需要 b > 45。我更倾向于使用 64 以使其成为一个不错的整数。也就是说,如果发生冲突,是否有处理冲突的计划(可能稍微改变时间戳,或者添加一个随机数?)
就此而言,如果 sha1 不仅仅基于文档的内容,为什么不简单地将其设为随机 ID?在这种情况下,冲突问题不大,因为您始终可以生成一个新的随机数并重试(不过,一次尝试的冲突概率是相同的)。
【讨论】:
注意截断,因为较小的哈希是安全的证据并没有减少。请参阅 Kelsey 的 http://csrc.nist.gov/groups/ST/hash/documents/Kelsey_Truncation.pdf。 Kelsey 给出了相同的启发式参数(“相关哈希输出”和“接近碰撞”)。 Biham/Chen 提供了近乎碰撞的例子; Knudsen 演示了截断微分。
最后,您可能希望将数据输入到 HMAC with 被截断的大小(大小也被 HMAC 消化),然后使用被截断的 HMAC。
【讨论】:
e^(-n^2/(2^(b+1))) 是估计截断的一个很好的近似值吗?如果不是,检查 最小位数 (bmin) 的 SHA1 截断的公式或算法是什么?
这确实没有价值;使 SHA 成为良好的通用散列算法的部分原因是相似的数据不一定会产生相似的散列值。您最好的选择(不了解您的系统的任何其他信息)只是搜索其哈希以用户提供的值开头的文档列表,然后向他们提供要从中选择的文档列表或直接转到文档如果只有一个。
【讨论】:
这是the birthday problem 中的generalization。在您的情况下,n 是文档的数量,而不是恒定的 365,您将有多种可能性,截止日期为您提供(因此对于 k 位,它是 2k)。
当然精确计算是不可能的,但你可以使用approximation。
【讨论】:
嗯,这可能是一个过于简单的答案..
如果使用完整的 sha1,您将获得大约 2^160 分之一的碰撞机会,那么通过截断一个字符,您可以将碰撞机会增加 16(截断字符的所有可能值)......这是 2^4。 . 所以,如果你截断 x 个字符,你会得到 1 in 2^(160 - 4*x) 的碰撞机会.. 对吗?
【讨论】: