Algorithm 散列-它做什么?

Algorithm 散列-它做什么?,algorithm,Algorithm,所以我一直在为期末考试复习哈希法,但我似乎无法理解发生了什么。有人能给我解释一下他们理解散列的最佳方式吗 很抱歉这个模糊的问题,但我希望你们能够说“什么是哈希”,这样我至少有一个开始,如果有人知道任何理解它的有用方法,那也会很有帮助。哈希是一个总结 数字序列(2,3,4,5,6)的散列是这些数字的汇总。例如,20是一种总结,它没有很好地包含原始数据中的所有可用位。这不是一个很好的总结,但它是一个总结 当值包含的数据超过几个字节时,某些位必须被拒绝。如果您使用sum和mod(例如,将总和保持在20

所以我一直在为期末考试复习哈希法,但我似乎无法理解发生了什么。有人能给我解释一下他们理解散列的最佳方式吗


很抱歉这个模糊的问题,但我希望你们能够说“什么是哈希”,这样我至少有一个开始,如果有人知道任何理解它的有用方法,那也会很有帮助。

哈希是一个总结

数字序列(2,3,4,5,6)的散列是这些数字的汇总。例如,20是一种总结,它没有很好地包含原始数据中的所有可用位。这不是一个很好的总结,但它是一个总结

当值包含的数据超过几个字节时,某些位必须被拒绝。如果您使用sum和mod(例如,将总和保持在20亿以下),您往往会保留大量最右边的位,而丢失所有最左边的位

所以一个好的散列是公平的——它公平地保留和拒绝位。这样可以防止碰撞


例如,我们过于简单的“求和散列”将在碰巧具有相同求和的其他数字序列之间发生冲突。

您获取一些数据并确定,单向计算某些固定长度的数据,当您稍微更改输入时,这些数据会完全改变。

应用于某些数据的哈希函数会生成一些新数据。 对于相同的数据,它总是相同的。 就这样

另一个经常被施加在它上面的约束,我认为这不是真的,就是散列函数要求你不能从散列中得出原始数据的结论。 对我来说,这是一个自己的类别,称为加密或单向散列

对某些类型的散列函数有很多要求

例如,哈希值总是相同的长度

或者,散列是为任何给定的输入数据序列随机分布的

唯一重要的一点是它的确定性(对于相同的数据总是相同的散列)

因此,您可以使用它来验证数据完整性、验证密码等

请在这里阅读所有相关内容


哈希是一种快速的启发式方法,用于查找对象的等价类

简而言之:

散列很有用,因为它在计算上很便宜。成本与等价类的大小无关

等价类是一组等价的项。考虑数字的字符串表示。你可能会说“042”、“42”、“42.0”、“84/2”、“41.9…”是同一基本抽象概念的等价表示。它们将在同一个等价类中

如果我想知道“042”和“84/2”是否可能相等,我可以为每一个计算哈希代码(一个廉价的操作),并且只有当哈希代码相等时,我才会尝试更昂贵的检查。如果我想将数字的表示形式划分为bucket,以便相同数字的表示形式在bucket中,我可以选择bucket by hash code

散列是启发式的,也就是说,它并不总是产生完美的结果,但是它的缺陷可以通过知道它们的算法设计者来缓解。哈希产生一个哈希代码。两个不同的对象(不在同一等价类中)可以生成相同的哈希代码,但通常不会,但同一等价类中的两个对象必须生成相同的哈希代码

你应该先读一读。然后就你不懂的话题提出问题

简而言之,引用这篇文章的意思是:

切碎

也就是说,给定一个值,您可以从中获得另一个(通常)较短的值(chop),但即使原始值的一小部分发生变化(mix),获得的值也应该发生变化

让我们以
x%9
作为散列函数的示例

345 % 9 = 3
355 % 9 = 4
344 % 9 = 2
2345 % 9 = 5
您可以看到,这个散列方法考虑了输入的所有部分,并且在任何数字发生变化时都会发生变化。这使它成为一个很好的散列函数

345 % 9 = 3
355 % 9 = 4
344 % 9 = 2
2345 % 9 = 5
另一方面,如果我们采取
x%10
。我们会得到

345 % 10 = 5
355 % 10 = 5
344 % 10 = 4
2345 % 10 = 5
正如您所看到的,大多数散列值都是
5
。这告诉我们,
x%10
是比
x%9
更糟糕的散列函数


请注意,
x%10
仍然是一个散列函数。身份函数也可以被视为一个哈希函数。

首先,我们应该说明使用哈希算法要解决的问题

假设您有一些数据(可能是数组、树或数据库条目)。您希望在这个数据存储中找到具体的元素(例如在数组中)的速度尽可能快。怎么做

当您构建这个数据存储时,您可以为您输入的每个项目计算特殊值(它被命名为HashValue)。计算该值的方法可能不同。但所有方法都应满足特殊条件:每个项目的计算值都应是唯一的

因此,现在您有了一个项目数组,对于每个项目,您都有这个HashValue。如何使用它?假设你有一个N元素数组。让我们根据项目的哈希值将其放入此数组

假设您要回答以下问题:此数组中是否存在项“it1”?要回答这个问题,您只需找到“it1”的HashValue(我们称之为f(“it1”)并查看f(“it1”)位置处的数组。如果这个位置的元素不是null(并且等于我们的“it1”项),我们的答案是true。否则答案是错误的

还有一个冲突问题:如何找到这样一个最酷的函数,它将为所有不同的元素提供唯一的hashvalue。实际上,这样的功能并不存在。有很多好的函数,可以为您提供好的值

一些更好理解的示例:

假设您有一个字符串数组:A={“aaa”、“bgb”、“eccc”、“dddsp”、…}。你要回答这个问题:这个数组是否包含字符串S

首先,我们是