我正在尝试使用以下函数创建唯一的记录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')
对于每个请求,
salt
和key
都是相同的值。我的问题是,由于胡椒粉的独特性质,在这个凹版中
make_uid
是否总是返回一个独特的值,或者它是否有可能创建一个复制品?。
最佳答案
。答案是肯定的和否定的。我从我的研究中得到以下结果,不是100%准确,但接近。
。它有2^256
结果。所以如果我们散列2^256 + 1
次,肯定会有冲突。更糟糕的是,根据统计,在散列的2^130
时间内发生冲突的可能性是99%.
但在你的有生之年你可能不会产生一个。假设我们有一台每秒可以计算10000个散列的计算机。这台计算机要花上几年才能完成哈希运算。你可能不知道这个数字有多大。散列的年数是人类在地球上存在的次数。这意味着即使你从我们第一天到现在都在做散列运算,碰撞的可能性仍然非常小。
希望这能回答你的问题。