2017-04-22 25 views
1

我嘗試使用下面的函數創建一個獨特的記錄ID: 使用hashlib.sha256創建唯一的ID;這保證是獨一無二的嗎?

import hashlib 
from base64 import b64encode 

def make_uid(salt, pepper, key): 
    s = b64encode(salt) 
    p = b64encode(pepper) 
    k = b64encode(key) 
    return hashlib.sha256(s + p + k).hexdigest() 

pepper設置是這樣的:

uuid_pepper = uuid.uuid4() 
pepper = str(uuid_pepper).encode('ascii') 

而且saltkey是爲每個請求的值相同。

我的問題是,由於辣椒的獨特性質,這個實例中的make_uid總會返回一個唯一值,或者有可能會創建一個重複的?

suggested answer是不同的,因爲我沒有問及各種uuid類型的獨特性,我想知道是否所有可能的sha256散列創建兩個不同的輸入之間的衝突。

+0

可能的重複[什麼時候應該使用uuid.uuid1()與uuid.uuid4()在python?](http://stackoverflow.com/questions/1785503/when-should-i-use-uuid- uuid1-vs-uuid -uuid4-in-python) – m0nhawk

+0

@ m0nhawk-我不是問我應該使用uuid1還是uuid4,我問我的hexdigest在這個例子中是否總是唯一的。 – mwkrimson

+0

如果你在鏈接上閱讀,那麼你會發現接受的答案**也回答你的問題。 – m0nhawk

回答

2

我想你想知道的是SHA256是否保證生成一個唯一的散列結果。答案是肯定的,不是。我從我的研究中得到了以下結果,並非100%準確但接近。

理論上,SHA256會發生碰撞。它有2^256的結果。所以如果我們散列2^256 + 1次,肯定會有碰撞。更糟糕的是,根據統計,在2^130次散列內碰撞的可能性是99%.

但是你可能在你的一生中不會生成一個。假設我們有一臺計算機可以計算每秒10,000次哈希值。它花費這臺計算機4 * 10^27年完成2^130哈希。你可能不知道這個數字有多大。哈希的年數是人類存在的年數的2 * 10^22倍。這意味着即使你從第一天開始進行哈希處理,直到現在,碰撞的可能性仍然非常小。

希望能回答你的問題。

+0

是的,這是我正在尋找的答案 - 理論上我可以與不同的輸入產生衝突。這似乎不太可能,但仍然有可能。謝謝! – mwkrimson