使用 hashlib.sha256 创建一个唯一的 id;这保证是独一无二的吗?

Using hashlib.sha256 to create a unique id; is this guaranteed to be unique?

我正在尝试使用以下函数创建一个唯一的记录 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 是否总是 return 一个唯一值,或者它是否有可能创建一个副本?

suggested answer 不同,因为我不是在询问各种 uuid 类型的唯一性,我想知道 sha256 哈希是否有可能在两个不同的输入之间产生冲突。

我想你想知道的是SHA256是否保证产生唯一的哈希结果。答案是肯定的,也不是。我从我的研究中得到以下结果,不是 100% 准确但接近。

理论上,SHA256 会发生碰撞。它有 2^256 个结果。所以如果我们散列 2^256 + 1 次,肯定会发生碰撞。更糟糕的是,据统计,2^130次散列内发生碰撞的可能性是99%.

但你可能一辈子都造不出来。假设我们有一台每秒可以计算 10,000 个哈希的计算机。这台计算机需要 4 * 10^27 年才能完成 2^130 哈希。您可能不知道这个数字有多大。哈希计算的年数是地球上人类存在年数的 2 * 10^22 倍。也就是说,即使你从我们在地球上的第一天开始到现在就开始哈希,碰撞的可能性仍然非常非常小。

希望这能回答您的问题。