散列函数将一个包含多个(甚至无限多个)成员的集合中的值投影到具有固定数量(更少)成员的集合中的值。哈希函数不是可逆。散列函数例如,可以定义为,其中,、和是楼层功能.
哈希函数可用于确定两个对象是否相等(可能存在固定的平均错误数)。哈希函数的其他常见用法有校验和大量数据(例如循环的,循环的冗余检查[CCRC])并通过键值在数据库中查找条目。这个UNIX c-shell(csh)使用哈希表存储可执行程序的位置。因此,在用户的搜索路径中添加新的可执行文件需要重新生成使用重新洗牌命令之前,这些程序可以在未指定完整路径的情况下执行。
为了说明哈希函数在数据库查找中的使用,请考虑一个由包含索引的数组组成的数据库、姓名和电话号码,姓名以任意形式列出订单。
要从这个数组中查找Hancock,可以从数组的开头开始,比较名称,然后尝试下一个,直到名称匹配。这个非常简单的算法在1到中查找任何条目步长,给出的平均寻道时间为。因此,寻道时间与。如果数据库已排序。
排序数组优先检查项的一种有效算法,然后递归使用平分检查中的条目间隔或,取决于是否最近查找的名称位于查找的名称之前或之后。平均寻道时间这与该程序的.
这里使用散列函数的想法是,虽然名称中可能的字符组合数量很大,但实际上通常只找到其中的一个子集(例如,“Kwqrst”之类的名称比“Jones”之类的名字要少见得多)。因此,当您将一个条目插入到数据库的某个索引中时,该索引可以通过某种方式使用键(在搜索时也可用)进行计算,稍后您可能会在检查的第一个位置找到它。
考虑下面的简单示例,其中散列函数只是名称中ASCII码字符的总和(考虑全部小写)计算的mod.
上面的示例说明了哈希函数可以为不同的键提供相同的结果。通常通过引入第二个散列函数其结果与为了便于说明,让名称中所有代码的位互斥或加一(再次作为全部小写)mod如下表所示。
然后,可以将新指数计算为第一个指数和(修订版)直到找到可以存储新数据的空插槽。请注意,使用时作为遍历数据库的偏移量,通常不能保证任何钥匙最终都会到达任何插槽。然而,对于某些值,即一质数,这样的行为是有保证,所以总是被选择成为首要的.计算后具有(a)首要的),上述电话按字母顺序添加的名称列表如下所示。
在此表中查找名称的平均查找时间取决于数据类型,,以及哈希函数的质量已使用。然而,对于哈希函数的合理选择,它将小得多比.
更多需要尝试的事情:
埃里克·魏斯坦(Eric W.Weisstein)。“哈希函数。”来自数学世界--Wolfram Web资源。https://mathworld.wolfram.com/HashFunction.html