我正在尝试使用以下函数创建唯一的记录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
总是会返回一个唯一的值,或者它是否有可能创建一个复制品?
suggested answer是不同的,因为我不是在询问各种uuid类型的唯一性,我想知道sha256哈希是否可能在两个不同的输入之间产生冲突。
答案 0 :(得分:7)
我想您想知道的是SHA256是否可以保证生成唯一的哈希结果。答案是肯定的,不是。我的研究得出以下结果,不是100%准确但非常接近。
理论上,SHA256会发生碰撞。它有2^256
个结果。因此,如果我们哈希2^256 + 1
次,则必定存在冲突。更糟糕的是,根据统计数据,在2^130
次散列中发生碰撞的可能性为99%.
但你可能不会在你的一生中产生一个。假设我们有一台可以计算每秒10,000次哈希的计算机。此计算机需要4 * 10^27
年才能完成2^130
哈希。你可能不知道这个数字有多大。进行散列的年数是地球上存在的人类的2 * 10^22
倍。这意味着即使你从我们在地球上的第一天起就开始做哈希,到现在为止,碰撞的可能性仍然非常小。
希望能回答你的问题。