我正在尝试使用以下函数创建唯一的记录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是否总是返回一个独特的值,或者它是否有可能创建一个复制品?

最佳答案

。答案是肯定的和否定的。我从我的研究中得到以下结果,不是100%准确,但接近。
。它有2^256结果。所以如果我们散列2^256 + 1次,肯定会有冲突。更糟糕的是,根据统计,在散列的2^130时间内发生冲突的可能性是99%.
但在你的有生之年你可能不会产生一个。假设我们有一台每秒可以计算10000个散列的计算机。这台计算机要花上几年才能完成哈希运算。你可能不知道这个数字有多大。散列的年数是人类在地球上存在的次数。这意味着即使你从我们第一天到现在都在做散列运算,碰撞的可能性仍然非常小。
希望这能回答你的问题。

08-04 08:08