哈希算法

哈希算法

前言

本文章,用作学习、记录,整理、借鉴于:https://www.juejin.im/post/6874708801208254478

基本介绍

哈希概念

散列(hashing)是电脑科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表),也译为散列,旧译哈希(误以为是人名而采用了译音)。它也常作一种咨询安全的实作方法,用一串资料中经过散列算法计算出的资料指纹,经常用来识别档案与资料是否有被篡改,以保证档案与资料确实是由原创者所提供。

哈希函数

根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址空间上的算法,也称为散列算法、杂凑算法。

常见的哈希算法:
1、MD4

MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年设计的,MD是Message Digest(消息摘要)的缩写。它适用在32位字长的处理器上用告诉软件实现——它是基于32位操作数的位操作来实现的。

2、MD5

MD5(RFC 1321)是Rivest于1991年对md4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与md4相同。MD5比MD4来的复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

3、SHA-1

SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。

哈希表

哈希表,大概意思就是Hash table,也叫哈希表,它是通过hash算法得来的,通常而言,是一个固定长度的数组。
假设关键字为value,那么其值存在与hash(value)的存储位置上,不需要比较就可以直接拿到所查记录,称这个对应关系为散列函数,按这个思想建立的表为散列表。
总的来说,哈希表就是一种映射关系代表,可以根据这个映射关系由(关键字)找到值。

如何解决哈希冲突

哈希冲突:由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据,经过计算后得到的值相同,这就是哈希冲突。

1、链地址法

每个数组单元中存储的不再是单个数据,二十一条链条,用的更多,java的HashMap,它解决hash冲突使用的就是链地址法。
在这里插入图片描述

一般而言,链表的长度是规定最长为8。

2、开放地址法

这种方法解决冲突的思路是,寻找空白的单元格来添加重复的数据。

那么这种方法有具体的探测方法:

  • 线性试探法
  • 二次探测
  • 再哈希法

线性探测法

线性探测法的地址增量di=1,2…,m-1,其中,i为探测次数。该方法一次探测下一个地址,知道有空的地址后插入,若整个空间都找不到空余的地址,则产生溢出。

二次探测

二次探测法的地址增量序列为di=2,-4,8,-16,…,q^2, q^2(q<=m/2)。二次探测能有效避免“聚集”现象,但是不能够探测到哈希表上所有的存储单元,但是至少能够探测到一半。

再哈希法

把关键字用另外一个哈希函数,再做一次哈希化,用这次哈希化的结果作为步长。

建立公共溢出区

将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表(注意:在这个方法里面是把元素分开两个表来存储)。

哈希应用

安全加密

日常用户密码加密通常使用的都是md5、sha等哈希函数,因为不可逆,而且微小的区别加密之后的结果差距很大,所以安全性更好。

唯一标识

比如URL字段或者图片字段要求不能重复,这个时候可以通过对相应字段值做md5处理,将数据统一为32位长度从数据库索引构建和查询角度效果更好,此外,还可以对文件之类的二进制数据做md5处理,作为唯一标识,这样判定重复文件的时候更快捷。

数据校验

比如从网上下载的很多文件(尤其是p2p站点资源),都会包含一个MD5值,用于校验下载数据的完整性,避免数据在中途被劫持篡改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值