SHA1哈希是否均匀分布?

Ale*_*lds 6 hash sha1 probability

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

hash_str = "foobarbaz?????????????..."
hash_obj = hashlib.sha1(hash_str, encode('utf-8'))
hash_id  = hash_obj.hexdigest()[:16]
Run Code Online (Sandbox Code Playgroud)

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

如果SHA1发生碰撞的概率为1 /(2 ^ 160)或1 /(16 ^ 40),则如果我采用十六进制表示的最后十六个字符,则发生碰撞的概率仅为1 /(16 ^ 16)?还是字节(或其等效的十六进制)分布不均?

abl*_*igh 5

是。表现出均匀性的任何哈希函数均具有通过随机选择的输入值生成其输出范围内的任何值的机会均等。因此,被截断的哈希的每个值也同样可能。SHA-1是散列函数,可显示均匀性,因此您的猜想是正确的。