Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用hashlib.sha256创建唯一id;这保证是独一无二的吗?_Python_Uuid_Hashlib - Fatal编程技术网

Python 使用hashlib.sha256创建唯一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哈希是否可能在两个不同的输入之间创建冲突。我想

我正在尝试使用以下函数创建唯一的记录id:

其中
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')