【问题标题】:Could anyone help provide a tutorial on hashing?任何人都可以帮助提供有关散列的教程吗?
【发布时间】:2015-03-29 11:56:50
【问题描述】:

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

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

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

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

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

这些应用程序在散列方面的相同点和不同点是什么? 你能帮忙提供一些关于这些散列的读物或参考吗?尤其是它们之间的差异。我对这些散列技术感到困惑。

【问题讨论】:

    标签: database hash hashtable consistent-hashing


    【解决方案1】:

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

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

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

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

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

    请注意,我们在现实生活中也会使用“散列算法”。我们在大公司中使用同事的名字是为了方便交谈/发送电子邮件/聊天(一个微不足道的哈希),即使肯定会有许多同名的同事。因此发生了冲突(“您是指会计部门的玛丽还是航运部门的玛丽?”)。您可以将所有已知的面巾纸产品“散列”成“Kleenex”一词(至少在美国是这样),但仍然更愿意购买和使用不同的品牌。

    【讨论】:

    • 嗨,@cybermike,非常感谢您的回复和如此详细的解释!我是散列的新手,因此对它的了解非常肤浅。我认为散列函数旨在将数据项映射到存储桶中并试图避免冲突。但是机器学习中的特征哈希是将相似的数据项映射到相似或相同的哈希码。两者都是为了经济的存储和更快的处理。我认为区别主要在于不同的应用需要不同的哈希函数设计方案。
    • 我有这个问题主要是因为我想对哈希有一个全面的了解,这有助于深入了解它的特点以及如何根据不同的优缺点来使用它们。
    • 在您的脑海中,将散列的高级概念与用于特定问题集的特定技术和实现分开。散列的概念允许人类和计算机处理每个成员具有唯一值的非数字数据,并将它们转换为数字摘要。哈希的实现相当多样化,适用于很多不同的问题和设计模式,确实重用了“哈希”这个词,但只是在概念上相似。
    • 谢谢! @cybermike。正如您所说,不同应用程序中的哈希在概念上是相似的,我认为需要时间来了解它的所有用法和差异。当我遇到一些关于它们的项目,或者对它们有更多的经验时,我会更容易理解它们。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多