我需要生成可以在文件名中使用的唯一标识符,并且可以在给定相同输入值的情况下重现。我需要生成数百万个这样的标识符,因为源输入有数百万种组合。
为了简单起见,我将在示例中使用一个小集合,但实际集合可能相当大(数百甚至数千个项目);大于可手动编码为文件名。
我注意到5th method of generating UUID's允许您提供字符串输入。
> input_set = {'apple', 'banana', 'orange'}
> uuid.uuid5(uuid.NAMESPACE_URL, pickle.dumps(input_set)).hex
'f39926529ad45997984643816c1bc403'
文档说它使用了SHA1
。碰撞的风险是否过高?有没有更好的方法可靠地散列唯一标识符?
答案 0 :(得分:2)
基于这个问题,我假设您对加密哈希函数了解不多。你从字符串中获得SHA1冲突的可能性非常低。目前,SHA1的已知冲突少于63个。
First ever SHA1 collision found
首先计算出SHA-1哈希冲突。所需要的只是五个聪明的大脑......以及6,610年的处理器时间
在加密领域,SHA1不再被认为是安全的,但肯定超出了您的预期。
加密散列函数被设计为one way functions。这意味着函数inverse是“难以”计算的。 (即知道输出绝不会帮助你确定输入)正如Blender在评论中指出的那样,这与碰撞的可能性无关。
查看Birthday Paradox以获取有关如何计算碰撞概率的一些基本信息。
This question解决了SHA1碰撞的可能问题。这article个州
如果发现冲突可以证明多项式时间可以从问题P中减少,则加密散列函数具有可证明的抵抗冲突攻击的安全性,问题P在多项式时间内应该是不可解的。然后,该函数被称为可证明安全的,或者只是可证明的。
Here是“安全”哈希算法的列表。
<强>更新强> 您在评论中说明您的输入远大于SHA1的160位限制。在这种情况下,我建议你使用SHA3,因为输入的大小没有限制。查看Python documentation以获取更多信息。
这是一个基本的例子:
import sha3
k = sha3.keccak_512()
k.update(b"data")
k.hexdigest()
'1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
答案 1 :(得分:1)