SHA1哈希值是否均匀分布?

9

我在Python中有一个字符串。我使用hashlib计算该字符串的SHA1哈希值。我将其转换为十六进制表示形式,并取最后16个字符作为标识符:

hash_str = "foobarbazάλφαβήταγάμμα..."
hash_obj = hashlib.sha1(hash_str, encode('utf-8'))
hash_id  = hash_obj.hexdigest()[:16]

我的目标是提供一个合理长度且不太可能为不同的hash_str输入生成相同的hash_id值的标识符。

如果SHA1冲突的概率是1 / (2 ^ 160),或1 / (16 ^ 40),那么如果我取十六进制表示的最后十六个字符,是否冲突的概率只有1 / (16 ^ 16)?或者字节(或它们的十六进制等效物)没有均匀分布吗?


3
如果sha1是均匀分布的,那么它的“数字”也是如此。由于sha1被构建为安全哈希函数,因此它应该是均匀分布的,或者至少非常接近(接近到您看不到区别)。 - AbcAeffchen
这不是实际碰撞的概率,真实的概率要高得多。要知道为什么,请搜索“生日悖论”。 - Pablo Fernandez
1个回答

6
是的。任何表现出均匀性属性的哈希函数,在其输出范围内,任意值被随机选择的输入值生成的概率都是相等的。因此,截断哈希的每个值也同样可能。SHA-1是一种展示均匀性的哈希函数,因此你的猜想是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接