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

时间:2017-04-22 17:36:04

标签: 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()

pepper设置如下:

uuid_pepper = uuid.uuid4()
pepper = str(uuid_pepper).encode('ascii')

saltkey对每个请求都是相同的值。

我的问题是,由于胡椒的独特性,这个版本中的make_uid总是会返回一个唯一的值,或者它是否有可能创建一个复制品?

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

1 个答案:

答案 0 :(得分:7)

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

理论上,SHA256会发生碰撞。它有2^256个结果。因此,如果我们哈希2^256 + 1次,则必定存在冲突。更糟糕的是,根据统计数据,在2^130次散列中发生碰撞的可能性为99%.

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

希望能回答你的问题。