任何人都可以帮助提供散列教程吗?

时间:2015-03-29 11:56:51

标签: database hash hashtable consistent-hashing

最近我读过一些关于散列技术的论文。似乎哈希无处不在。

在计算机科学中,哈希表通常用作有效的查找数据结构。

在加密中,散列采用的技术包括md5 hash,sha hash等。

在数据库区域。散列是在数据库中构建表的键。

在机器学习中,散列是为了高效处理和经济存储而创建短哈希码,例如局部敏感散列,最小哈希,sim哈希,哈希技巧等。

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

1 个答案:

答案 0 :(得分:1)

我认为散列的关键点是能够获取一组长度可变,动态性和异步的内容,并且能够将算法应用于该内容的每个成员,从而产生“稳定” “,固定大小,每个都是唯一的标识符。这就是你引用的大多数例子的重点:

  • 哈希表:将可变长度键字符串或结构转换为具有已知下限和上限的“稳定”唯一标识符(也称为数组中的行号,数组中行的地址,数据库中的行号)。 / LI>
  • 加密:将可变长度纯文本转换为稳定,唯一且固定长度的标识符。
  • 机器学习(至少是Hashing Trick):将单词(可能还有它们的上下文)转换为一个稳定而独特的键,形成一个通用的数字组织本体

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

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

此外,哈希几乎总是“单向”。大多数散列算法都是故意“有损”(这就是重复发生的原因),因此通常无法从摘要/散列值反向计算原始变量长度内容。有蛮力的方法,但通常不可能进行简单快速的反向计算。

请注意,我们在现实生活中也使用“哈希算法”。我们使用大公司的同事的名字作为谈话/电子邮件/聊天的便利(一个简单的哈希),即使肯定会有许多同名的同事。因此发生了碰撞(“你是指会计中的玛丽还是装运中的玛丽?”)。你可以将面巾纸的所有已知产品“哈希”到“Kleenex”这个词(至少在美国),但仍然喜欢购买和使用不同的品牌。