hash:

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

hash碰撞:

如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。既然是把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的。一个优良的hash函数 f 应当满足以下三个条件:

(1)对于任意y,寻找x,使得f(x)=y,在计算上是不可行的。

(2)给定x1∈A,找x2∈B,,使得f(x1)=f(x2),在计算上是不可能的,这也就是弱无碰撞性。

(3)寻找x1,x2,使得f(x1)=f(x2),在计算上也是不可行的,这也就是强无碰撞性。

这样就称为安全保密的Hash函数,除了枚举外不可能有别的更快的方法。如第3条,根据生日定理,要想找到这样的x1,x2,理论上需要大约2^(n/2)的枚举次数。

因为前两条都能被破坏的hash函数太弱而被抛弃,几乎所有的hash函数的破解,都是指的破坏上面的第3条性质,即找到一个碰撞。在密码学上还有一个概念是理论破解,指的是提出一个算法,使得可以用低于理论值得枚举次数找到碰撞。

解决方法:

对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。

1.开放地址法

开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。

如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。

如果di取值可能为伪随机数列。称伪随机探测再散列。

2.再哈希法

当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止。

3.链地址法(拉链法)

将所有关键字为同义词的记录存储在同一线性链表中。如下:

因此这种方法,可以近似的认为是筒子里面套筒子。

优点:

①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;

④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

缺点:

指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

4.建立一个公共溢出区

假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

hash和hash碰撞以及解决方案相关推荐

  1. 到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?

    一 ,到底什么是hash呢? 作者:知乎用户 链接:https://www.zhihu.com/question/26762707/answer/40119521 来源:知乎 著作权归作者所有.商业转 ...

  2. hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解

    提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解. 1.什么是Has ...

  3. hash function/ hash table 背后的数学基础(二)

    hash function/ hash table 背后的数学基础 perfect hashing(完美哈希) 给定 nn 个键,构建一个静态表(static hash table,也即没有插入和删除 ...

  4. linux 命令缓存机制(命令:hash) | hash -r使用场景和作用

    文章目录 linux 命令缓存机制(命令:hash) | hash -r使用场景和作用 什么是hash 缓存表 hash命令 hash -r使用场景和作用 linux 命令缓存机制(命令:hash) ...

  5. Hash——字符串Hash

    Hash 在学习本节课之前,请大家思考这样一个问题:如果我们要在一个长度为 N N N的随机整数序列 A A A中统计每个数出现的次数,可以用什么方法? 不难想到,我们可以建立一个数组 ,然后将整数序 ...

  6. 【PHP】PHP实现Hash环/Hash一致性原理实现

    PHP实现Hash环/Hash一致性原理 Hash环可用于Redis机器集群.Mysql的分表操作,扩容时能对最大限度的减少损失 文章开头先引用大佬文章:什么是Hash环 class consisTe ...

  7. 浅析一致性hash和hash槽

    通过本文将收获如下: 文章中有一些补充知识点,不想了解可以跳过 为什么Redis Cluster的Hash Slot 是16384? 什么是hash(概念) 什么是一致性hash 什么是hash sl ...

  8. 一致性hash算法-hash环-数据倾斜

    一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...

  9. HashMap之Hash碰撞冲突解决方案及未来改进

    说明:参考网上的两篇文章做了简单的总结,以备后查(http://blogread.cn/it/article/7191?f=wb  ,http://it.deepinmind.com/%E6%80%A ...

最新文章

  1. AE 9.3代码 升级到AE10.0
  2. CComboBox 类详细说明
  3. K8S部署工具:KubeOperator集群导入
  4. 排序 - 冒泡法(改进)
  5. python教程--__init_.py的作用
  6. C#常用42个操作类
  7. 千千静听 dfx 音效插件_专业团队的蝰蛇音效,好听就是好软件
  8. linux 打包排除文件类型,Linuxtar或zip命令打包排除后缀文件
  9. iWebOffice2015入门(二)
  10. 通用技术和信息技术合格考知识点_高二信息与通用技术会考知识点.doc
  11. 从键盘输入字符串,按回车键结束,在第二行显示输入内容。
  12. bitcscs计算机系统,深入理解计算机系统CSAPP-美-布莱恩特
  13. 安科瑞ACX电瓶车智能充电桩,充满自停,多样支付,10路端口,安全保护
  14. 传统企业如何做数字化转型?弄懂这3大底层逻辑你就懂了
  15. 若依 监控中心monitor的使用
  16. 【嵌入式】如果用PS导出GIF图片
  17. tzc 1292 排序
  18. android studio编程实例,Android Studio JNI 开发简单案例
  19. 看完 穿条纹睡衣的男孩 之后
  20. 【C】C语言函数中的变量(包括:作用域、存储类型)

热门文章

  1. linux gz文件合并,快速合并多个fastq.gz文件
  2. Vue Cli3 添加Loader和plugin
  3. Vue CLI 3 安装、创建、配置、安装插件
  4. 为什么看不起trap_old school歌手和trap歌手为什么互相看不惯?
  5. 手机号中间四位加星号
  6. 经典的操作系统调度算法-多级反馈队列(MLFQ)
  7. MALT1 抑制剂,1926163-57-6,Z-VRP-DArg-FMK
  8. python中pyecharts安装_Pyecharts安装使用和绘图案例
  9. python---声压级计算
  10. 洛谷 P5725 求三角形