秒懂Hash算法(一):什么是Hash
Hash函数
在一般的线性表、树结构中,数据的存储位置是随机的,不像数组可以通过索引能一步查找到目标元素。为了能快速地在没有索引之类的结构中找到目标元素,需要为存储地址和值之间做一种映射关系h(key),这个h就是哈希函数,用公式表示:
h(key)=Addr
h:哈希函数
key:关键字,用来唯一区分对象的
把线性表中每个对象的关键字通过哈希函数h(key)映射到内存单元地址,并把对象存储到该内存单元,这样的线性表存储结构称为哈希表或散列表。
构造哈希函数
构造哈希函数的方法有很多种,下面介绍几种常见的算法。在设置哈希函数时,通常要考虑以下因素:
○ 计算函希函数所需的时间
○ 关键字的长度
○ 哈希表的长度
○ 关键字的分布情况
○ 记录的查找频率
1. 直接定址法
直接定址法取关键字或关键字的某个线性函数作为哈希地址,即
h(key) = key
或
h(key) = a*key + b
其中a,b为常数,调整a与b的值可以使哈希地址取值范围与存储空间范围一致。这种方法简单并且不会发生冲突,适用于关键字分布基本连续的情况,若关键字分布不连续,将造成存储空间的巨大浪费。
2. 数字分析法
数字分析法是提取关键字中随机性较好的数字位,将其拼接作为哈希地址,适用于所有关键字已知的情况,并需要对关键字中每位的取值情况进行分析。如下图,经分析c,f,g,h这几位取值较为集中,随机性不好,不适用于哈希函数,而a,e取值分散,可将这两个数字拼接位哈希地址。需要注意,提取多少位数字应该根据哈希表长度来确定。
位 h g f e d c b a 提取结果
6 1 3 1 7 6 3 2 12
6 2 3 2 6 8 7 5 25
6 2 3 4 3 6 3 4 44
6 2 7 0 6 6 1 6 6
6 1 7 7 4 6 3 8 78
6 1 3 8 1 2 6 1 81
6 1 3 9 4 2 2 0 90
3. 除留余数法
除留余数法采用取模运算,把关键字除以某个不大于哈希表表长的整数得到的余数作为哈希地址。哈希函数形式为:
h(key) = key % p
除留余数法的关键是选好P,使得记录集合中的每个关键字通过该整数转换后映射到哈希表范围内任意地址上的概率相等,从而尽可能减少发生冲突的可能性。
例如,P不要设为2的次幂,如设P=25,则对P的取模相当于截取P的最低5位二进制数,这等于将关键字的所有高位二进制数都忽略了。理论研究表明,P取奇数比偶数效果好,P取不大于哈希表长度的质数效果最好。
507683的二进制 11110111111001
507683%2相当于取低5位二进制数
秒懂Hash算法(一):什么是Hash的更多相关文章
- hash算法和常见的hash函数 [转]
Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 分布式缓存技术memcached学习(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...
- Hash算法初见
hash算法 (hashmap 实现原理) Hash ,一般翻译做“ 散列” ,也有直接音译为“ 哈希” 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定 ...
- Java实现一致性Hash算法深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原 ...
- OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法
1.Ring的基本概念 Ring是swfit中最重要的组件.用于记录存储对象与物理位置之间的映射关系,当用户须要对Account.Container.Object操作时,就须要查询相应的Ring文件( ...
- 一致性Hash算法与代码实现
一致性Hash算法: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值 ...
- 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议
node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...
- Hash算法入门指南(聊点不一样的算法人生)
前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...
- 几种常用hash算法及原理
计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很 ...
随机推荐
- TL9000 电信业质量体系管理标准
1.背景介绍:1987年国际标准化组织创立了ISO9000标准.标准发布后,在世界范围内得到了迅速的推广和广泛的认可,成为全世界衡量质量管理水平与质量保证能力的公共标准.九十年代,美国三大汽车公司和航 ...
- 零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷
原文:零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷 在Chapter 2 有稍微讲过Design内建笔刷的用法,本章将教大家如何自制独一无二的笔刷,并且重 ...
- ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新建项目(Windows) 对于任何语言和框架,都 ...
- Python抓取小说
Python抓取小说 前言 这个脚本命令MAC在抓取小说写,使用Python它有几个码. 代码 # coding=utf-8 import re import urllib2 import chard ...
- Android新的漏洞的应用程序中的发现!
最近,趋势科技发现一些Android中的漏洞应用程序内存.来发动攻击.我们调查了两个受影响的应用程序,大家来感受一下: .超过一千万次安装.及在下载页面拥有数十万笔用户留言的生产力应用程序(生产力应用 ...
- WPF 获得DataGridRow和 DataGridCell的方法
原文:WPF 获得DataGridRow和 DataGridCell的方法 原文地址 简介 在WPF中,DataGrid控件并没有提供访问其DataGridRow或者DataGridCell的方法. ...
- C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...
- Win8Metro(C#)数字图像处理--2.8图像线性变换
原文:Win8Metro(C#)数字图像处理--2.8图像线性变换 2.8图像线性变换 [函数名称] 图像线性变换函数LinearTransformProcess(WriteableBitmap ...
- 指定Qt程序运行的style,比如fusion(以前没见过QStyleFactory)
转载请注明文章:指定Qt程序运行的style,比如fusion 出处:多客博图 代码很简单,如下: #include <QtWidgets/QApplication> #include ...
- Win10《芒果TV》商店版更新v3.1.3.0:优化应用速度,支持会员卡兑换
在微软秋季Win10/Surface新品发布会热潮之后,<芒果TV>UWP版迅速更新v3.1.3版,优化应用启动速度,支持会员卡券兑换,新增全网搜索.记忆播放.消息推送等功能. 芒果TV ...