2015-11-06 129 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是顯示一致性的散列函數,因此您的猜想是真實的。