2015-11-06 90 views
3

我在Python中有一个字符串。我用hashlib计算该字符串的SHA1哈希值。我将其转换为它的十六进制表示,并采取最后16个字符作为标识符的使用方法:SHA1散列是否均匀分布?

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

我的目标是提供合理长度和不大可能产生相同的hash_id值用于不同hash_str输入的标识符。

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

+2

如果sha1是均匀分布的,那么也是它的“数字”。由于sha1被构造为一个安全的散列函数,它应该是均匀分布的或至少非常接近它(如此接近以至于看不到差异)。 – AbcAeffchen

回答

3

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