最近我读过一些关于散列技术的论文。似乎哈希无处不在。
在计算机科学中,哈希表通常用作有效的查找数据结构。
在加密中,散列采用的技术包括md5 hash,sha hash等。
在数据库区域。散列是在数据库中构建表的键。
在机器学习中,散列是为了高效处理和经济存储而创建短哈希码,例如局部敏感散列,最小哈希,sim哈希,哈希技巧等。
这些应用程序在散列方面有哪些相同和不同之处? 你能帮忙提供一些有关这些散列的读物或参考资料吗?特别是他们的差异。我对这些散列技术感到困惑。
答案 0 :(得分:1)
我认为散列的关键点是能够获取一组长度可变,动态性和异步的内容,并且能够将算法应用于该内容的每个成员,从而产生“稳定” “,固定大小,每个都是唯一的标识符。这就是你引用的大多数例子的重点:
在所有这些情况下,您正在对组中每个成员的可变长度内容进行小型总结。这些小的摘要使得处理所有可变长度内容变得更加容易,并且在散列表的情况下可以显着加快处理速度。或者特别是在密码学的情况下可以提供显着的好处,例如密码保护(使用正确的密钥和重复哈希)或内容完整性验证。
您会注意到哈希几乎总是会导致碰撞的可能性:例如:具有不同内容的组中两个完全不同的成员,但哈希算法生成相同的摘要/哈希值。散列函数设计的一个关键部分是确定允许的可接受重复级别,并在散列实现的设计中正确处理碰撞。对于仅使用少量RAM的哈希表,冲突率可能很高。使用256位加密散列函数,碰撞概率可能实际上为零。
此外,哈希几乎总是“单向”。大多数散列算法都是故意“有损”(这就是重复发生的原因),因此通常无法从摘要/散列值反向计算原始变量长度内容。有蛮力的方法,但通常不可能进行简单快速的反向计算。
请注意,我们在现实生活中也使用“哈希算法”。我们使用大公司的同事的名字作为谈话/电子邮件/聊天的便利(一个简单的哈希),即使肯定会有许多同名的同事。因此发生了碰撞(“你是指会计中的玛丽还是装运中的玛丽?”)。你可以将面巾纸的所有已知产品“哈希”到“Kleenex”这个词(至少在美国),但仍然喜欢购买和使用不同的品牌。