SHA1 哈希值是不是均匀分布?

Posted

技术标签:

【中文标题】SHA1 哈希值是不是均匀分布?【英文标题】:Are SHA1 hashes distributed uniformly?SHA1 哈希值是否均匀分布? 【发布时间】:2016-02-07 00:51:26 【问题描述】:

我在 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),那么如果我取十六进制表示的最后 16 个字符,那么冲突的概率只有 1/ (16^16)?还是字节(或它们的十六进制等效值)分布不均匀?

【问题讨论】:

如果 sha1 是均匀分布的,那么它的“数字”也是均匀分布的。由于 sha1 被构造为一个安全的散列函数,它应该是均匀分布的或至少非常接近它(如此接近以至于你看不到差异)。 这不是碰撞的实际概率,真实的概率要高得多。想知道为什么谷歌会出现“生日悖论” 【参考方案1】:

是的。任何具有uniformity 属性的哈希函数都有相同的机会在其输出范围内的任何值由随机选择的输入值生成。因此,截断散列的每个值也同样可能。 SHA-1 是证明一致性的哈希函数,因此你的猜想是正确的。

【讨论】:

以上是关于SHA1 哈希值是不是均匀分布?的主要内容,如果未能解决你的问题,请参考以下文章

Pearson 哈希 8 位实现产生非常不均匀的值

C#中的SHA1哈希值是否会永远返回给定字符串的相同值?

在 MySQL 中存储 SHA1 哈希值

Go+ SHA1 哈希值教程(4.12)

Redis分布式部署,一致性hash

如何在 C++ 中可移植地计算 sha1 哈希?