哈希算法(哈希函数)的基本使用

  • 什么是哈希?
    • 哈希的原理和特点
    • 数组与哈希表
  • 哈希函数
    • 哈希函数的冲突与碰撞
  • 哈希算法
  • 哈希的应用

什么是哈希?

如果我们需要誊抄一本新华字典,那么有什么方法呢?比如当我们誊抄到某一页的时候,我们发现这一页字典上共有500个字,如果这时候我们抄的纸张上没有500个字,那么我们就需要重抄了,这就是哈希算法。
Hash,一般直接音译为"哈希",就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

哈希的原理和特点

1、哈希具有不可逆性。通过哈希函数以及算法转变成的数值无法再转变回来,从哈希值不能反向推导原始数据,因此哈希和加密是不等价的。
2、哈希具有灵敏性,对输入数据很敏感,哪怕只改了一个字节,哈希值也会随之改变。
3、哈希具有碰撞性,哈希在存储数据的时候会发生数据的冲突与碰撞
4、哈希算法执行效率要高,散列结果要尽量均衡。

数组与哈希表

举个例子,假如在一个果园里,有着苹果、雪梨、橘子、葡萄等水果,在以前,我们会建立一个数组,用数组的下标对应的位置来表示、存储他们。

但我们又需要知道,一个果园里的水果种类不可能仅仅这几种,可能有十几种甚至几百种,而这时候如果单凭数组的下标来记忆种类,是非常不方便的,因此这时候便出现了哈希表。
从某种意义上来说,哈希表是一种更高级的数组。哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
哈希表和数组具有不同的存储方式,哈希表不再使用索引,而是用健值对的形式进行表示。

数组里的索引值是整数,可以通过这个整数找到对应的内存地址,哈希表里的键可以是整数或者是字符串,但这个键不会直接指向对应的内存地址,而这种计算过程来寻找哈希键指向的内存地址的方法,即被称为哈希函数。

哈希函数

假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为h(k)=k%p,其中%为模p取余运算。除留余数法的模p取不大于表长且最接近表长m素数时效果最好,且p最好取1.1n~1.7n之间的一个素数(n为存在的数据元素个数)。这种方法就是最简单的哈希函数计算方法。

哈希函数的冲突与碰撞

开放寻址法
开放寻址法是解决散列表发生碰撞的方法之一,与另外一种方法–链接法相对应。开放寻址法把所有的元素都存放在散列表中,也就是每个表项包含动态集合的一个元素,或者包含NIL。
当查找一个元素时,要检查所有的表项,直到找到所需的元素,或者最终发现元素不在表中。不像在链接法中,这里没有链表,也没有元素存放在散列表外。在这里散列表有可能会被填满,但是装载因子(动态集合元素/散列槽数)绝对不会大于1。
在开放寻址法中,当要插入一个元素时,可以连续地检查散列表的个各项,直到找到一个空槽来放置这个元素为止。检查顺序可以是线性的,可以是二次的,也可以是再次散列的。

查找关键字和插入关键字的算法基本上是一样的。

哈希算法

1、MD5

1、输入任意长度的信息,经过处理,输出为128位的信息;
2、不同的输入得到的不同的结果,每个输入与结果是一一对应的;
3、根据128位的输出结果不可能反推出输入的信息;

普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上用户存储的密码一般都是用MD5算法加密后进行存储的。因为一般由MD5反推密码的破解时长很久,而用户登陆时只需要输入密码,当密码转换为的值同数据库里存储的值一样时就匹配成功。
2、SHA
安全哈希算法主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种"指纹"或是"摘要"所以对散列值的数字签名就可以视为对此明文的数字签名。

哈希的应用

1、安全加密
日常用户密码加密通常使用的都是 md5、sha等哈希函数,因为不可逆,而且微小的区别加密之后的结果差距很大,所以安全性更好。
2、唯一标识
对文件之类的二进制数据做 md5 处理,作为唯一标识,这样判定重复文件的时候更快捷,且具有唯一性。
3、数据校验
比如从网上下载的很多文件都会包含一个 MD5 值,用于校验下载数据的完整性,避免数据在中途被劫持篡改,通过这个MD5我们可以知道下载的软件是否纯正。
4、散列函数
MD5、SHA、Hash 等函数都是基于哈希算法计算散列值。
5、负载均衡
对于同一个客户端上的请求,尤其是已登录用户的请求,需要将其会话请求都路由到同一台机器,以保证数据的一致性,这可以借助哈希算法来实现,通过用户 ID 尾号对总机器数取模(取多少位可以根据机器数定),将结果值作为机器编号。
6、分布式缓存
分布式缓存和其他机器或数据库的分布式不一样,因为每台机器存放的缓存数据不一致,每当缓存机器扩容时,需要对缓存存放机器进行重新索引(或者部分重新索引),这里应用到的也是哈希算法的思想。

哈希算法(哈希函数)的基本使用相关推荐

  1. 哈希算法(Hash函数)简单介绍

    1.什么是哈希算法?(Hash函数) 哈希算法的定义和原理: 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则,就是哈希算法.而通过原始数据映射之后得到的二进制值串就是哈希值. 设计一 ...

  2. 数据结构与算法之美学习笔记:哈希算法-哈希算法在分布式系统中有哪些应用(第22讲)...

    上一节,我讲了哈希算法的四个应⽤,它们分别是:安全加密.数据校验.唯⼀标识.散列函数.今天,我们再来看剩余三种应用: 负载均衡.数据分片.分布式存储 你可能已经发现,这三个应用都跟分布式系统有关.没错 ...

  3. 相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)

    图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字"指纹"的方法.散 ...

  4. linux加密框架 crypto 算法管理 - 创建哈希算法实例

    crypto_alloc_ahash函数 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的,但是算法应用不关注哈希算法的实现方式,关注的是哈希算法提供的算法接口.为实现统一管理,加密框架 ...

  5. (二十三)图像相似度比较哈希算法

    图像相似度比较哈希算法 相似图像搜索的哈希算法有三种: 1.均值哈希算法 2.差值哈希算法 3.感知哈希算法 什么是哈希(Hash) • 散列函数(或散列算法,又称哈希函数,英语: Hash Func ...

  6. 常见数据结构-哈希算法

    一,什么是哈希算法 哈希和散列其实意思是一样的,只是中文翻译的区别,英文是 Hash. 哈希算法也叫 hash 算法或散列算法.哈希算法的定义:将任意长度的二进制串映射为固定长度(一般是 128 bi ...

  7. 18 哈希算法的应用和一致性哈希

    什么是哈希算法 哈希=散列=Hash,所以哈希算法即散列函数. 哈希算法定义:输入任意长度的二进制串,将其映射为固定长度的二进制串,这个映射的规则就是哈希算法.输出的二进制串就是哈希值,也叫散列值. ...

  8. 计算机视觉的几个经典算法 —— 最小二乘法 + RANSAC + 哈希算法(附DCT) + 图像聚类算法

    计算机视觉的几个经典算法 目录 计算机视觉的几个经典算法 1. 最小二乘法(寻找线性回归函数) 2. RANSAC(模型已知,参数未知) 2.1 RANSAC 与 最小二乘法的区别 2.2 RANSA ...

  9. 一致性哈希算法原理,应用及代码实现

    1,大量热点数据问题 在高并发的分布式系统中,缓存等服务大多都采用集群部署,但任然经常会存在大量的热点数据,经常在缓存或者数据库查询,为保证缓存或数据库服务的高可用,尽可能的让其不出现宕机的情况,需要 ...

最新文章

  1. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)
  2. 我们能从大学里学到什么
  3. python有相关的证书可以考吗-python的证书
  4. 分享一个ASP.NET 文件压缩解压类 C#
  5. snmp在企业网中的简单应用
  6. 【转】Java MySQL数据类型对照
  7. linux iptables配置
  8. 《大数据》第1期“研究”——大数据管理系统评测基准的 挑战与研究进展(上)...
  9. JS判断图片是否加载完毕
  10. cocos2dx游戏开发简单入门视频教程 (cocos2d-x)- 第5天
  11. TensorFlow基础篇(六)——tf.nn.max_pool()和tf.nn.avg_pool()
  12. 解方程c语言程序,C语言程序解线性方程组
  13. spring 多租户数据源实现事务一致性
  14. css+html实现时间轴
  15. 英文文本分类——电影评论情感判别
  16. 读取NTFS的USN(快速检索文件)
  17. 解决了!微信公众号数学公式排版
  18. poj 2456 Aggressive cows 【二分+最大化最小值】
  19. 深入理解wifi direct
  20. java设计模式之Facade模式

热门文章

  1. 手机续航能力测试软件,五小时极限测试告诉你荣耀X10续航表现怎么样
  2. 关于学术道德,我们应该遵循的规范
  3. 我们为什么来到这个世界上?
  4. 宝石熔炼设备可以融化黄金吗?
  5. 小啊呜产品读书笔记001:《邱岳的产品手记-05》第9讲 产品案例分析:Hopper的“人工智能” 第10讲 产品被抄袭了怎么办?
  6. 将若干字符串按照字母顺序输出
  7. 如何使用sql语句算两经纬度的距离
  8. 从天津滨海新区大爆炸、危化品监管聊聊 IT人背负的社会责任感
  9. java 自动点击网页_JS脚本实现网页自动秒杀点击
  10. 中小企业信息安全:基本原则