Python 使用hashlib.sha256创建唯一id;这保证是独一无二的吗?
我正在尝试使用以下函数创建唯一的记录id: 其中Python 使用hashlib.sha256创建唯一id;这保证是独一无二的吗?,python,uuid,hashlib,Python,Uuid,Hashlib,我正在尝试使用以下函数创建唯一的记录id: 其中pepper设置如下: uuid_pepper = uuid.uuid4() pepper = str(uuid_pepper).encode('ascii') 和salt和key对于每个请求都是相同的值 我的问题是,由于胡椒粉的独特性质,在这种情况下,make\u uid是否总是返回一个唯一的值,或者它是否有可能创建一个副本 这是不同的,因为我不是在问各种uuid类型的唯一性,我想知道sha256哈希是否可能在两个不同的输入之间创建冲突。我想
pepper
设置如下:
uuid_pepper = uuid.uuid4()
pepper = str(uuid_pepper).encode('ascii')
和salt
和key
对于每个请求都是相同的值
我的问题是,由于胡椒粉的独特性质,在这种情况下,make\u uid
是否总是返回一个唯一的值,或者它是否有可能创建一个副本
这是不同的,因为我不是在问各种uuid类型的唯一性,我想知道sha256哈希是否可能在两个不同的输入之间创建冲突。我想你想知道的是sha256是否保证生成唯一的哈希结果。答案是肯定的和否定的。我从我的研究中得到了以下结果,不是100%准确,但很接近 理论上,SHA256将发生碰撞。它有
2^256个结果。因此,如果我们将2^256+1
散列几次,一定会发生冲突。更糟糕的是,根据统计数据,在2^130
次散列中发生冲突的可能性是99%。
但在你的有生之年,你可能不会产生一个。假设我们有一台每秒可以计算10000个哈希的计算机。这台计算机要花费4*10^27
年才能完成2^130
哈希运算。你可能不知道这个数字有多大。做哈希运算的年数是地球上人类生存年数的2*10^22倍。这意味着,即使你从我们来到地球的第一天起就开始做散列运算,到现在为止,碰撞的可能性仍然很小
希望这能回答你的问题 @m0nhawk可能重复-我不是问我应该使用uuid1还是uuid4,我是问我的hexdigest在这种情况下是否总是唯一的。如果你继续链接并阅读,你会发现接受的答案也回答了你的问题。@m0nhawk我不确定如何使用-我没有使用uuid作为我的记录id,但是作为散列创建的一部分。我想知道结果哈希是否总是唯一的,而不是uuid4是否是唯一的。@mwkrimson Nice也是。是的,这就是我一直在寻找的答案——理论上我可以与不同的输入发生冲突。这似乎不太可能,但仍然有可能。谢谢我认为计算需要多少年才能有1%的机会(例如0.000000000 1%的机会)比计算99%的机会需要多少年更实际。如果概率已经达到99%,那么在这之前碰撞已经发生过很多次了。所以,基本上每个人都想知道的是距离第一次碰撞还有多少年,而不是直到99%的几率。如果即使在100年内,碰撞的可能性仍然低于某个阈值(例如10^(-20%),那么可以使用sha256根据数据生成ID,否则就不是了。
uuid_pepper = uuid.uuid4()
pepper = str(uuid_pepper).encode('ascii')