广州杰肯狸网络科技有限公司
主营产品:
哈希游戏系统技术开发搭建(现成源码)
发布时间:2024-04-30

哈希算法(Hash Algorithm)即散列算法的直接音译。開发V:I82/OO8O/8II6

  我们可以通过特定的计算方法,利用任意长度的输入(例如文本等信息)生成一个固定长度的字符串。这个字符串就是该输入的哈希值。

  哈希表(HashTable,也叫散列表),是根据键名(Key)直接访问对应内存存储位置的数据结构。

  其实现原理是通过哈希函数(也叫散列函数)将元素的键名映射为数组下标(转化后的值叫做哈希值或散列值),然后在对应下标位置存储记录值。当我们按照键名查询元素时,可以使用同样的哈希函数,将键名转化为数组下标,从对应的数组下标位置读取数据

  显然,哈希表使用了数组支持按照下标随机访问数据的特性,所以哈希表其实就是数组的一种扩展,由数组演化而来。可以说,没有数组,就没有哈希表。我们知道,数组访问元素的时间复杂度是O(1),所以哈希表也是一样(不考虑哈希函数的复杂度的话),因此非常高效。

  此外,我们也可以看到,哈希技术既是一种存储方法,也是一种查找方法。不过,与之前介绍的查找算法不同的是哈希表的不同记录之间不存在逻辑关系,因此适合求解的问题是查找与给定值相等的记录,而不适合做范围查询。

  哈希表中有两个关键的概念,一个是哈希函数(或者叫散列函数),一个是哈希冲突(或者叫散列冲突)。

  二、哈希函数与哈希冲突

  哈希函数用于将键名经过处理后转化为对应的哈希值。具有以下特性:

  哈希函数计算得到的哈希值是非负整数;

  如果key1==key2,则hash(key1)==hash(key2);

  如果key1!=key2,则hash(key1)!=hash(key2)。

  所谓哈希冲突,简单来说,指的是key1!=key2的情况下,I35开发7O98案例O7I8软件可V,通过哈希函数处理,hash(key1)==hash(key2),这个时候,我们就说发生了哈希冲突。

  设计再好的哈希函数也无法避免哈希冲突,根本原因是哈希值是非负整数,总量是有限的,但是现实世界中要处理的键名是无限的,将无限的数据映射到有限的集合,肯定避免不了冲突。

  事实上,如果不考虑哈希冲突,哈希表的查找效率是非常高的,时间复杂度是O(1),比二分查找效率还要高,但是因为无法避免哈希冲突,所以哈希表查找的时间复杂度取决于哈希冲突,情况可能是O(n),退化为顺序查找。这种情况在哈希函数设计不合理的情况下更糟。

  哈希函数设计

  要减少哈希冲突,提高哈希表操作效率,设计一个的哈希函数至关重要,我们平时经常使用的MD5加密就是一个哈希函数,但是其实还有其他很多自定义的设计实现,要根据不同场景,设计不同的哈希函数来减少哈希冲突,而且哈希函数也要足够简单,否则执行哈希函数本身会成为哈希表的性能瓶颈。

  我们日常很少会自己去设计哈希函数,但是做一些简单的了解还是有必要的。通常有以下几种哈希函数构造方法:

  直接定址法:即f(key)=a*key+b,f表示哈希函数,a、b是常量,key是键名;

  数字分析法:即对数字做左移、右移、反转等操作获取哈希值;

  除数留余法:即f(key)=key%p,p表示容器数量,这种方式通常用在将数据存放到指定容器中,如何决定哪个数据放到哪个容器,比如分表后插入数据如何处理(此时p表示拆分后数据表的数量),分布式Redis如何存放数据(此时p表示几台Redis服务器);


展开全文
商铺首页 拨打电话 发送询价