我如何确保哈希函数不会为 2 个以上的不同条目生成相同的密码?

How can I make sure that a hash function won't produce the same cypher for 2+ different entries?

编辑:有些人将这个问题标记为 另一个问题的潜在重复。虽然我同意知道生日悖论如何适用于哈希函数,但这 2 个问题(和各自的答案)解决了 2 个不同但相关的主题。 另一个问题是问 “碰撞的几率是多少”,而这个问题的主要焦点是 “我怎样才能确保碰撞永远不会发生”.

我在 S3 中存储了一个数据湖,每天 ETL 脚本都会转储前一天的额外数据。

由于管道的构建方式,具有管理员访问权限的非常粗心的用户可能会通过手动与来自我们的 OLTP 数据库的转储文件进行交互并触发 ETL 脚本,在所述数据湖中生成重复项在不应该的时候。

我认为防止数据重复的一个好主意是在我的 ETL 脚本中插入一种安全措施:

但是,我对散列算法知之甚少,而且我在读到,虽然不太可能,但 2 个不同的来源可以产生相同的散列值。

我知道在这种情况下很难做到,但我想知道是否有办法 100% 确定它。

非常感谢任何想法。

长答:你要研究和探索的东西叫做“完美哈希”(即哈希保证不会有冲突。https://en.wikipedia.org/wiki/Perfect_hash_function

简短回答:像 sha-1 这样的加密防碰撞算法可能可以安全地用于除最大(每天 PB)数据集之外的所有数据集,即使这样也可能没问题。 Git 在内部使用 sha-1,代码存储库可能处理地球上最多的文件并且很少发生冲突。 详情见:https://ericsink.com/vcbe/html/cryptographic_hashes.html#:~:text=Git%20uses%20hashes%20in%20two,computed%20when%20it%20was%20stored.

中等答案:总体而言,这实际上是一个非常困难的问题,也是计算机科学的一个常见研究领域,并且在很大程度上取决于您的特定用例和您所处的环境。布谷鸟哈希、抗碰撞算法、和散列一般来说可能都是研究的好术语。在选择这些方法时,space(内存)和时间(需要的计算机能力)背后也有很多艺术和科学。一个好的经验法则是完美哈希通常比像 sha-1 这样的抗冲突加密哈希占用更多 space 和时间。