Hash SHA1散列是否均匀分布?

Hash SHA1散列是否均匀分布?,hash,probability,sha1,Hash,Probability,Sha1,我有一个Python字符串。我使用hashlib计算该字符串的SHA1哈希。我将其转换为十六进制表示形式,并将最后16个字符用作标识符: hash_str = "foobarbazάλφαβήταγάμμα..." hash_obj = hashlib.sha1(hash_str, encode('utf-8')) hash_id = hash_obj.hexdigest()[:16] 我的目标是提供合理长度的标识符,并且不可能为不同的hash\u str输入产生相同的hash\u id值

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

hash_str = "foobarbazάλφαβήταγάμμα..."
hash_obj = hashlib.sha1(hash_str, encode('utf-8'))
hash_id  = hash_obj.hexdigest()[:16]
我的目标是提供合理长度的标识符,并且不可能为不同的
hash\u str
输入产生相同的
hash\u id


如果SHA1碰撞的概率是1/(2^160)或1/(16^40),那么如果我取十六进制表示的最后十六个字符,碰撞的概率只有1/(16^16)吗?或者字节(或其十六进制等价物)分布不均匀?

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

如果SHA-1是均匀分布的,那么它的“数字”也是一致的。因为sha1被构造成一个安全的散列函数,所以它应该均匀分布,或者至少非常接近它(如此接近以至于你看不到区别)。这不是实际发生冲突的概率,真实的概率要高得多。了解谷歌为何“生日悖论”