Hash 如何确保哈希函数赢';t为2+产生相同的密码;不同的条目?

Hash 如何确保哈希函数赢';t为2+产生相同的密码;不同的条目?,hash,Hash,编辑:有些人将此问题标记为可能与另一个问题重复。虽然我同意知道生日悖论如何应用于散列函数,但这两个问题(以及各自的答案)解决了两个不同但相关的主题。 另一个问题是问“碰撞的可能性有多大”,而这个问题的主要焦点是“如何确保碰撞不会发生” 我有一个存储在S3中的数据湖,每天都有一个ETL脚本转储前一天的额外数据 由于管道是如何构建的,一个具有管理员权限的非常轻率的用户可以通过手动与来自我们的OLTP数据库的转储文件交互,并在不应该触发ETL脚本时触发ETL脚本,从而在所述数据池中生成副本 我认为防止

编辑:有些人将此问题标记为可能与另一个问题重复。虽然我同意知道生日悖论如何应用于散列函数,但这两个问题(以及各自的答案)解决了两个不同但相关的主题。 另一个问题是问“碰撞的可能性有多大”,而这个问题的主要焦点是“如何确保碰撞不会发生”

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

由于管道是如何构建的,一个具有管理员权限的非常轻率的用户可以通过手动与来自我们的OLTP数据库的转储文件交互,并在不应该触发ETL脚本时触发ETL脚本,从而在所述数据池中生成副本

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

  • 为每个条目生成一个哈希
  • 商店说散列在其他地方(比如dynamodb表)
  • 每当有新数据出现时,也对其进行散列,并将其与已有的散列进行比较
  • 如果现有散列中有任何新的散列,则完全拒绝关联的条目
然而,我对散列知之甚少,我读到,虽然不太可能,但两个不同的源可以产生相同的散列

我知道在这种情况下很难做到这一点,但我想知道是否有办法百分之百地确定这一点


任何想法都是值得赞赏的。

详细回答:你想要研究和探索的被称为“完美哈希”(即保证不会发生冲突的哈希)

简短回答:像sha-1这样的加密防冲突算法可能可以安全地用于除最大(每天PBs)数据集之外的所有数据集,甚至可能也可以。Git在内部使用sha-1,代码存储库可能处理地球上最多的文件,很少发生冲突。 有关详细信息,请参阅:


中等回答:这实际上是一个相当困难的问题,也是计算机科学的一个经常研究的领域,很大程度上取决于您的特定用例和您的操作环境。布谷鸟哈希、抗冲突算法和一般的哈希可能都是很好的研究术语。还有很多艺术和科学在选择这些方法时,在空间(内存)和时间(所需的计算机电源)的后面。一个很好的经验法则是,完美的散列通常会比像sha-1这样的抗冲突加密散列占用更多的空间和时间。

“我不知道这是否会发生”-从数学上讲,几乎总是有可能的(除了类似的东西)太长了,读不下去了。这个可能性很大程度上取决于你散列的项目数量和你选择的算法。可能的重复。注意到应用于散列函数的生日悖论,但这并不是我要问的。问题不是“机会有多大…”,而是“如何100%确保避免…”如何确保冲突不会发生?您必须接受非零的冲突概率。sha2-256就足够了。如果您确实发现冲突,那么该冲突可能比数据更值钱。感谢您的深入了解,我不知道“完美哈希”概念。我将检查它!