2017-04-22 247 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