SHA1 哈希是否均匀分布?

Are SHA1 hashes distributed uniformly?

我在 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)?还是字节(或它们的十六进制等价物)分布不均?

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