哈希函数

散列表(哈希)

白昼怎懂夜的黑 提交于 2019-12-06 07:00:45
散列表 ( 哈希 ) 简介 简述 散列函数 冲突 开放地址法 链接法(也称链地址法) 链接法对比与开放地址法的优缺点 名词解释 我们来讲述散列表。 散列表是一种数据结构,它具有以下性质: 应用广泛 查找快速 等 举个例子。 你在超市工作,一位顾客来购买商品,你家超市刚刚好没有自动销售机,你得亲自去查找该商品的价格。如果我们是这样的话,那么顾客每买一个商品,都要找一下该商品并且知道它的价格。那么我们非常花费时间。如果我们能够找到这样一个人:能够记住所有商品的价格的人。那么我们在帮顾客结账的时候将会非常快速。 即使你是用一个小本本把你商店的东西都记上了,并且是按照一定的顺序记号的。即使使用二分查找,那么我们也会花费一定的时间。想必此时顾客已经不耐烦了。他们可能会说:“怎么这么久!!!”,然后你的商店可能会产生很多很多的怨气...... 我们从数据结构的方面去看这个问题,那么所有的商品就有了这样的一个特性: 商品的key 以及 商品的 卫星数据 。 如果我们按照一个特殊的函数去把相对应的 KEY 值转换成另一个东西,并且记录在小本子上,我们只需直接翻到这个本子相对应的部分,就可以找到了该商品的价格了,以及还有其他的信息。 ---->BACK<---- 散列函数 那么我们的问题来了,我们该怎样创建这个数据类型呢?首先了解一下,散列函数 散列函数是“将输入映射到数字”

单向散列函数

安稳与你 提交于 2019-12-06 02:46:42
介绍 单项散列函数又称安全散列函数或哈希函数,根据消息的内容计算出散列值,散列值又称为消息摘要或者摘要 消息摘要长度固定,主要用来验证消息的完整性 单项散列算法的种类: MD4/MD5/SHA 单项散列函数原理 1. A准备好待传输的文件 2. A使用单项散列函数计算出消息摘要 3. A将文件和消息摘要一起发送给B 4. B接收文件之后,使用单项散列函数计算消息摘要 5. B对比接收的消息摘要和计算的消息摘要是否一致 单项散列函数特点 1. 输入长度可变 2. 输出长度固定 3. 只能计算输入到输出 SHA256介绍 1. 输入小于2^64 bit的任意长度 2. 分组长度为512 bit,经过计算得到256 bit的消息摘要 3. SHA256 消息摘要长度256 bit 4. SHA384 消息摘要长度384 bit 5. SHA512 消息摘要长度512 bit SHA 预处理 预处理会对消息进行填充,使消息长度达到512整数倍. 填充完成后,将消息进行分组. 重点:这里的消息填充为算法自动填充,不需要外界的参数, 例如初始化向量IV等. 来源: https://www.cnblogs.com/luanxueguang/p/11958699.html

哈希表(散列表)总结

痴心易碎 提交于 2019-12-05 08:37:07
1、哈希表(散列表hash table)定义 哈希表 就是利用哈希算法(散列技术)将记录保存到一块连续的存储空间中,这块连续的存储空间就叫做哈希表或散列表。 散列技术 就是根据记录的存储位置和它的关键字KEY建立一个确定的对应关系F,使得每一个关键字key对应一个存储位置F(key)。查找时根据这个确定的对应关系找到给定值key的映射F(key)。 这个确定的对应关系就叫做 散列函数 ,又叫做哈希函数。关键字对应的记录存储位置叫做 散列地址。 2、哈希表的查找步骤: (1)、当存储时,通过散列函数计算出散列地址,然后按照散列地址将记录存储到散列表中。 (2)、当查找时,使用与存储时相同的散列函数计算出散列地址,按次散列地址访问该记录。 所以散列技术即使一种存储方法,又是一种查找方法。 3、哈希表与其他数据结构的区别(如线性表、树、图等)? 其他数据结构存储的数据元素之间存在某种逻辑关系,而哈希表的记录之间不存在任何逻辑关系,记录只和关键字存在关联。即一个关键字对应一个记录。哈希表存储的是键值对的形式。 哈希表的好处是查找速度快,查找时较其他数据结构简化了比较过程,提高了效率。但哈希表不具备很多常规数据结构的能力,如当一个关键字对应多个记录时,不适合用哈希表存储;同时哈希表也不适合范围查找,对与对记录排序、获取最大值最小值也不能得到。 散列冲突

枯燥高深的哈希函数分析

与世无争的帅哥 提交于 2019-12-04 23:53:22
今天看到一篇报道王小云的文章,描述了她是如何破解MD5和SHA-1这两大哈希函数的。 其中王小云提到自己做 哈希函数分析 10年,心里就是下定决心要做这方面的研究,自然而然也就获得了成功。 在我看来,密码学作为区块链技术的基础,是非常高深,同时也是非常枯燥的。各种各样的区块链上层应用让我觉得丰富多彩,但是唯独密码学这项底层技术如同一座大山一般令我无法翻越。要研究这些必须要能静下心来。 我曾和SimpleChain团队专门研究密码学的同学交流,从大佬那学到不少。 大佬表示,很多密码学的技术都是基于最基础的密码学知识,例如哈希算法、椭圆曲线等等。如果能过对其中一些关键的算法步骤手算推导,加深对基础的理解,很多复杂的技术就能很快吸收掌握。 所以,学习技术还是要从最基础的一步步开始啊。 来源: https://my.oschina.net/u/4090317/blog/3131245

【转帖】她破解哈希函数算法:坚持10年做一件事一定能做成

大兔子大兔子 提交于 2019-12-04 18:21:29
她破解哈希函数算法:坚持10年做一件事一定能做成 https://www.cnbeta.com/articles/tech/911577.htm 山大出身。。 今年9月7日,2019未来科学大奖揭晓,这项设立4年的大奖迎来首位女性得主——密码学家王小云。在信息时代,金融服务、网络安全等背后都离不开密码系统的“护航”。在大众眼中,密码带着神秘色彩,王小云破解和设计密码的经历则更为传奇。 MD5和SHA-1曾是最先进的国际通用密码,被专家认为需要运算100万年才有可能破解。2004年和2005年,这两大“固若金汤”的算法被王小云先后破解,在国际密码学界引发强烈“地震”。 2005年,王小云和国内专家设计了我国首个哈希函数算法标准SM3。如今,SM3已为我国多个行业保驾护航。 11月16日傍晚,梳着干练短发、带着典型学者风采的王小云出现在2019未来科学大奖周。问及此次获奖的感受,这位低调的科学家表示,她非常感谢大家对她的支持和关爱,希望大家更多关注和支持密码科技事业和这个领域年轻的人才。 王小云在未来科学大奖周接受媒体采访。新京报记者 张璐 摄 从小对数理化兴趣浓厚 1966年,王小云出生于山东诸城一个教师家庭。她的父亲毕业于诸城师范学校的数学与化学班,受父亲影响,王小云从小就对数理化表现出浓厚的兴趣。 由于高考数学成绩优异,她报考了山大数学系。当时,山大数学系师资力量雄厚

哈希表

匿名 (未验证) 提交于 2019-12-03 00:41:02
  今天是7.20,是计划的截止日期。前几天一直在玩滑板拖着没写博客没学习,今天下午又学习了一遍哈希表的知识,按计划该写博文完成哈希表的学习。   哈希表(hash table)又称为散列表,是一种对实体进行索引的数据结构。它的特点是查询速度快,一个拥有好的哈希函数的哈希表,进行查找时可以实现均摊常量时间O(1)的时间复杂度,这无疑是很快速的查找速度。比方说,数组本身就是最简单的一种哈希表,根据数组下标可以快速找到下标对应的数组元素。   对于哈希表,根据解决冲突的形式不同,有开散列和闭散列两种形式。这里的“开、闭”可以形象地认为是,主表状态是发散(开散列)的还是一维线性结构(闭散列)。   有了对哈希表的大概了解,下面再详细介绍一下哈希表的基本组成部分。   首先,哈希表由键-值组成(key-value)。键是实体被索引时的标识符,值是被索引的实体。举下面一个例子对键和值进行说明:   《红楼梦》 ――――> 文学类, 在以上的例子中,文学类即是键,而《红楼梦》则是值。一般使用数组元素存储值,使用数组下标表示键。   其次,由值转化为键的过程,需要使用哈希函数,哈希函数是一种将值映射到键的规则与方法。哈希函数可以理解为值与键的对应关系。输入一个值,根据哈希函数,可以求得一个对应的键。一个好的哈希函数,会让将不同的值尽可能映射成不同的键。举下面一个例子对哈希函数进行说明:  

散列/哈希总结

匿名 (未验证) 提交于 2019-12-03 00:22:01
哈希函数很强大,最近算法课老师讲了哈希函数的一系列应用。这里总结一下。 一、哈希表 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。 哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元素的,因此,哈希表查找的时间复杂度为O(1), 最坏的情况下查找一个元素的时间与在链表中查找一个元素的时间相同。最坏的情况下都是O(N)。有一个常用的概念定义为load factor(装载因子)算法导论中给的定义为:给定一个能存放n个元素的,具有m个槽位的散列表T。定义T的装载装载因子a为n/m,即一个链中平均存储的元素。 一个好的散列函数应满足简单一致散列的假设。每个关键字都等可能的散列到m个槽位的任何一个之中去,并与其它的关键字已被散列到哪一个槽位中无关。 二、散列函数 1.除法散列法 在用来设计散列函数的除法散列法之中,通过取k除以m的余数,来将关键字k映射到m个槽中去,定义散列函数为 h(k)=k

哈希(散列)详解

匿名 (未验证) 提交于 2019-12-02 23:55:01
散列表(也叫哈希表),是根据关键字值而直接进行访问的数据结构。 通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数的构造方法: (1)直接定址法 (2)除留余数法 (3)平方取中法 (4)折叠法 (5)数值分析法 本文采用除留余数法构造散列函数。 H(K) = (H(k) + i) % m; 其中i = 1, 2, …, m为哈希表大小。 构造散列函数的目的是减少冲突,但要完全避免冲突是不可能的,只能尽可能减少冲突。 处理冲突的方法: (1)开放定址法 (2)二次探测法 (3)链地址法(拉链法) 开放地址法: 线性探查法:H(K) = (H(k) + i) %d 每次+1,一次循环查找。缺点:容易造成聚集现象 平法探查法:H(K) = (H(k) + ) %d 每次加 ,避免了线性探查的聚集现象,缺点:不能探查到散列表的所有单元,但知道可以探查到散列表的一半单元。 根据原始数组建立一个哈希表,哈希表也为一个数组,且要求哈希表有固定大小。 本文采用 开放定址法处理冲突 ,线性探查法。 当由H(k)算出的位置不为空时,则通过已经构造的散列函数来寻找新的空位置。 从H(k)开始往后逐个搜索空位置,如果后面没有空位置,则从头开始搜索,直到搜索到空位置,或者回到H(k)停止搜索。(回到H(k)则说明搜索失败) 举例

内存崩溃了?其实你只需要换一种方式

谁说我不能喝 提交于 2019-12-02 15:15:20
在上一篇 Java 多线程爬虫及分布式爬虫架构探索 中,我们使用了 JDK 自带的 Set 集合来进行 URL 去重,看上去效果不错,但是这种做法有一个致命了缺陷,就是随着采集的 URL 增多,你需要的内存越来越大,最终会导致你的内存崩溃。那我们在不使用数据库的情况下有没有解决办法呢?还记得我们在上一篇文章中提到的布隆过滤器吗?它就可以完美解决这个问题,布隆过滤器有什么特殊的地方呢?接下来就一起来学习一下布隆过滤器。 什么是布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 ,它是在 1970 年由一个名叫布隆提出的,它实际上是由一个很长的二进制向量和一系列随机映射函数组成,这点跟哈希表有些相同,但是相对哈希表来说布隆过滤器它更高效、占用空间更少,布隆过滤器有一个缺点那就是有一定的误识别率和删除困难。布隆过滤器只能告诉你某个元素一定不存在或者可能存在在集合中, 所以布隆过滤器经常用来处理可以忍受判断失误的业务,比如爬虫 URL 去重。 布隆过滤器原理 在说布隆过滤器原理之前,我们先来复习一下哈希表,在上一篇文章中,我们利用的是 Set 来进行 URL 去重,我们来看看 Set 的存储模型 URL 经过一个哈希函数后,将 URL 存入了数组里,这样查询时也是非常高效的,但是由于数组里存入的是 URL,随着 URL 的增多,需要的数组越来越大,意味着你需要更多的内存

哈希算法

。_饼干妹妹 提交于 2019-12-02 11:17:50
哈希是密码学的基础,理解哈希是理解数字签名和加密通信等技术的必要前提。 一. 基本含义: 哈希,英文是 hash ,本来意思是”切碎并搅拌“,有一种食物就叫 Hash ,就是把食材切碎并搅拌一下做成的。哈希函数的运算结果就是哈希值,通常简称为哈希。哈希函数有时候也翻译做散列函数。 根据维基百科的定义,哈希函数要做的事情是 给一个任意大小的数据 生成出一个 固定长度 的数据,作为它的映射。所谓映射就是一一对应。一个可靠的哈希算法要满足三点。 第一是安全,给定数据 M 容易算出哈希值 X ,而给定 X 不能算出 M ,或者说哈希算法应该是一个单向算法。 第二是独一无二,两个不同的数据,要拥有不相同的哈希。 第三是长度固定,给定一种哈希算法,不管输入是多大的数据,输出长度都是固定的。 但是仔细想一下,如果哈希的长度是固定的,也就是取值范围是有限的,而输入数据的取值范围是无限的,所以总会找到两个不同的输入拥有相同的哈希。所以,哈希函数的安全性肯定是个相对概念。如果出现了两个不同输入有相同输出的情况,就叫碰撞,collision 。不同的哈希算法,哈希位数越多,也就基本意味着安全级别越高,或者说它的”抗碰撞性“就越好。 二. 哈希算法的主要作用: 再来说说哈希函数的主要作用。哈希的独一无二性,保证了如果数据在存储或者传输过程中有丝毫损坏,那么它的哈希就会变