任何人都可以帮助提供有关哈希的教程吗?

Could anyone help provide a tutorial on hashing?

最近看了一些关于散列技术的论文。散列似乎无处不在。

在计算机科学中,散列table通常用作高效的查找数据结构。

在加密中,散列是在md5散列、sha散列等技术中

在数据库区。哈希是在数据库中构建 table 的密钥。

在机器学习中,哈希是为了高效处理和经济存储创建短哈希码,例如局部敏感哈希、min-hash、sim-hash、hashing trick 等。

这些应用在哈希上有哪些相同点和不同点? 你能帮忙提供一些关于这些散列的读物或参考资料吗?特别是他们之间的差异。我对这些散列技术感到困惑。

我认为散列的本质是能够获取一组可变长度、本质上动态且异步的内容,并能够将算法应用于该内容的每个成员,从而产生"stable",固定大小,并且基本上是每个标识符的唯一标识符。这就是您引用的大多数示例的重点:

  • 哈希表:将可变长度的键字符串或结构转换为 "stable" 具有已知下限和上限的唯一标识符(也称为数组中的行号、数组中行的地址、数组中的行号)数据库)。
  • 密码学:将可变长度的纯文本转换为 stable、唯一且固定长度的标识符。
  • 机器学习(至少是哈希技巧):将单词(可能还有它们的上下文)转换为 stable 并将唯一键转换为通用的数字组织 ontology

在所有这些情况下,您都在对组中每个成员的可变长度内容做一个小总结。这些小摘要使得处理所有可变长度的内容变得更加容易,并且在散列 tables 的情况下可以显着加快处理速度。或者特别是在密码学的情况下可以提供显着的好处,例如密码保护(当使用适当的键控和重复哈希时)或内容完整性验证。

您会注意到哈希几乎总是会导致潜在的冲突:例如该组的两个完全不同的成员具有不同的内容,但哈希算法生成相同的 summary/hash 值。哈希函数设计的一个关键部分是确定允许的 acceptable 重复级别,并在哈希实现的设计中正确处理冲突发生时。对于仅使用少量 RAM 的散列 table,冲突率可能很高。使用 256 位加密哈希函数,碰撞概率实际上可以为零。

此外,散列几乎总是 "one way"。大多数散列算法都是故意 "lossy"(这就是重复发生的原因),因此通常无法仅从 summary/hash 值反向计算原始可变长度内容。有蛮力的方法解决这个问题,但通常不可能进行简单快速的逆向计算。

请注意,我们在现实生活中也使用 "hashing algorithms"。我们在大公司中使用同事的名字作为谈话/电子邮件/聊天的便利(一个简单的哈希),即使肯定会有很多同事使用相同的名字。因此发生了碰撞("Do you mean Mary in Accounting or Mary in Shipping?")。你可能"hash"所有已知的面巾纸产品都变成了"Kleenex"这个词(至少在U.S。),但仍然喜欢购买和使用不同的品牌。