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

mwk*_*son 2 python uuid hashlib

我正在尝试使用以下函数创建唯一的记录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()
Run Code Online (Sandbox Code Playgroud)

在哪里pepper设置如下:

uuid_pepper = uuid.uuid4()
pepper = str(uuid_pepper).encode('ascii')
Run Code Online (Sandbox Code Playgroud)

saltkey是为每个请求的值相同.

我的问题是,由于辣椒的独特性,make_uid这种情况总会返回一个独特的价值,或者它是否有可能产生重复?

建议的答案是不同的,因为我不要求有关各种UUID类型的独特性,我想知道它是否在所有可能的SHA256哈希创建两个不同的输入之间的冲突.

Jun*_*ang 9

我想您想知道的是SHA256是否可以保证生成唯一的哈希结果.答案是肯定的,不是.我的研究得出以下结果,不是100%准确但非常接近.

从理论上讲,SHA256会发生碰撞.它有2^256结果.因此,如果我们哈希2^256 + 1时间,必然会发生冲突.更糟糕的是,据统计,在2^130哈希时间内发生碰撞的可能性更大99%.

但是你可能不会在你的一生中生成一个.假设我们有一台可以计算每秒10,000次哈希的计算机.这台计算机需要花费数4 * 10^27年才能完成2^130哈希.你可能不知道这个数字有多大.进行散列的年数是2 * 10^22人类存在的时间.这意味着即使你从我们在地球上的第一天到现在开始进行散列,碰撞的可能性仍然非常小.

希望这能回答你的问题.