话题
搜索

哈希函数


散列函数小时将一个包含多个(甚至无限多个)成员的集合中的值投影到具有固定数量(更少)成员的集合中的值。哈希函数不是可逆。散列函数小时例如,可以定义为y=H(x)=| _10x(模块1)_|,其中R中的x,[0,9]中的y、和|_x个_|楼层功能.

哈希函数可用于确定两个对象是否相等(可能存在固定的平均错误数)。哈希函数的其他常见用法有校验和大量数据(例如循环的,循环的冗余检查[CCRC])并通过键值在数据库中查找条目。这个UNIX c-shell(csh)使用哈希表存储可执行程序的位置。因此,在用户的搜索路径中添加新的可执行文件需要重新生成使用重新洗牌命令之前,这些程序可以在未指定完整路径的情况下执行。

为了说明哈希函数在数据库查找中的使用,请考虑一个由包含索引的数组组成的数据库n个、姓名和电话号码,姓名以任意形式列出订单。

n个名称
0帕克12345
1(空)
2戴维斯43534
哈里斯32452
4科里亚46532
5汉考克96562
6布雷克37811
7(空)
N-1号机组马尔萨利斯54323

要从这个数组中查找Hancock,可以从数组的开头开始,比较名称,然后尝试下一个,直到名称匹配。这个非常简单的算法在1到中查找任何条目N个步长,给出的平均寻道时间为不适用。因此,寻道时间与N个。如果数据库已排序。

n个名称
0布雷克
1科里亚
2戴维斯
汉考克
4哈里斯
5马尔萨利斯
6帕克
7(空)
N-1号机组(空)

排序数组优先检查项的一种有效算法不适用,然后递归使用平分检查中的条目间隔[0,N/2-1]【N/2+1,N-1】,取决于是否最近查找的名称位于查找的名称之前或之后。平均寻道时间这与该程序的lnN公司.

这里使用散列函数的想法是,虽然名称中可能的字符组合数量很大,但实际上通常只找到其中的一个子集(例如,“Kwqrst”之类的名称比“Jones”之类的名字要少见得多)。因此,当您将一个条目插入到数据库的某个索引中时,该索引可以通过某种方式使用键(在搜索时也可用)进行计算,稍后您可能会在检查的第一个位置找到它。

考虑下面的简单示例,其中散列函数小时只是名称中ASCII码字符的总和(考虑全部小写)计算的modN=13.

名称小时
布雷克6
科里亚2
戴维斯2
汉考克12
哈里斯12
马尔萨利斯2
帕克8

上面的示例说明了哈希函数可以为不同的键提供相同的结果。通常通过引入第二个散列函数氢气其结果与小时为了便于说明,让氢气名称中所有代码的位互斥或加一(再次作为全部小写)modN-1型如下表所示。

名称氢气
布雷克11
科里亚
戴维斯10
汉考克4
哈里斯8
马尔萨利斯
帕克8

然后,可以将新指数计算为第一个指数和氢气(修订版N个)直到找到可以存储新数据的空插槽。请注意,使用时氢气作为遍历数据库的偏移量,通常不能保证任何钥匙最终都会到达任何插槽。然而,对于某些值N个,即N个质数,这样的行为有保证,所以N个总是被选择成为首要的.计算后氢气具有N=13(a)首要的),上述电话按字母顺序添加的名称列表如下所示。

指数钥匙比较以查找
0(空)
1(空)
2科里亚1
汉考克2
4(空)
5马尔萨利斯2
6布雷克1
7哈里斯2
8帕克1
9(空)
10(空)
11(空)
12戴维斯2

在此表中查找名称的平均查找时间取决于数据类型,N个,以及哈希函数的质量已使用。然而,对于哈希函数的合理选择,它将小得多lnN公司.


另请参见

无冲突哈希函数,密码散列函数,循环(Cyclic)冗余检查,单向哈希函数,哈希表,通用哈希函数

与Wolfram一起探索| Alpha

工具书类

Partow,A.“通用散列函数算法”http://www.partow.net/programing/hashfunctions(网址:http://www.partow.net/programing/hashfunctions)/.

引用关于Wolfram | Alpha

哈希函数

引用如下:

埃里克·魏斯坦(Eric W.Weisstein)。“哈希函数。”来自数学世界--Wolfram Web资源。https://mathworld.wolfram.com/HashFunction.html

主题分类