热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【基础算法】简单了解一下常见的几种散列算法?

简单了解一下常见的几种散列算法?如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录|先点这里

简单了解一下常见的几种散列算法?



如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里

  • 前提概念
    • 好的哈希函数
  • MD5 与 SHA
    • MD5
    • SHA 家族
  • CRC
  • MurmurHash
  • times31/33
    • times33
    • times31

前提概念




好的哈希函数


  • list of hash functions - wikipedia



好的哈希函数

好的哈希函数应该具备如下几种特性

  • One-way 单向性
    输出确定,且无法逆推出源数据,即单向散列函数
  • Collision-resistant 抗冲突性
    产生两个相同散列值的概率低
  • Avalanche effect 雪崩效应
    原始数据的微小改动,会导致散列值巨大的差异



MD5 与 SHA




MD5

md5 摘要算法,又称 “MD5 Message-Digest Algorithm”, 是一种不可逆向的密码散列函数。

特性

  • 任意长度的原始数据,都将输出定长为 128 bit 的散列值
  • 属于加密散列函数,计算较为耗费 CPU 资源



SHA 家族

SHA 家族的加密算法,又称 “Secure Hash Algorithm”, 是一个密码散列函数家族,发布了多个版本的 SHA 加密函数,如 SHA-0,SHA-1,SHA-2,SHA-3 等

特性

  • 大部分仅支持 2^64 -1 的输入数据,根据不同的版本,有不同的位长,如 160,224,256,384,512 等,位数较长
    • sha-0,sha-1 输入不超过 2^64-1, 输出定长 160 bit



对比


  • MD5 和 SHA 通常都用在安全加密领域,因为都涉及数字加密,所以计算量都比较大,都比较消费 CPU 资源
    在这里插入图片描述


CRC



CRC 算法 ("Cyclic Redundancy Check") ,又称循环冗余校验算法,是一种常用于通信链路检错,判断数据是否损坏的散列函数,但也不局限于此,它的基本原理是利用除法与余数的原理来做为错误侦测的

我们进行通信时的网络信道并不总是可靠的。为了增加可靠性,我们需要在传输数据后加上一些冗余的码字。如果接收方能够通过它们直接纠正错误,那么我们就称之为纠错码(Error Correcting Code),而 CRC 就是一种优秀的检错码,因为 CRC 具有良好的雪崩效应,即单个 bit 发生改变,也会导致散列值发生较大的改变,所以得以在通讯领域广泛应用。

原理

  • 计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC,而这里的除数则是一种 “模二除法”
  • 通讯传送中,发送方会在原始数据末尾加上 CRC 检错码,并与接收方约定好 “除数 (多项式)”,最会得到余数 (CRC 值),接收方就会以收到的原始数据除以约定好的除数,看看最终的结果是否与 CRC 检错码一致

在这里插入图片描述

比如发送发传输了一段二进制数据,并附上 CRC 校验码。接收方就可以根据所接收到的二进制数据的 CRC 散列值与接收到的 CRC 检错码进行比对,如果不一致,就代表接收的数据可能在通讯传输过程中有缺失或错误

  • 不要跑,CRC没这么难!(简单易懂的CRC原理阐述)

特性

  • CRC 的协议有非常多种,比如 CCITT, MODBUS 等
  • CRC 根据多项式的不同也会产生不同长度的检错码 (散列值),比如 CRC-8,CRC-16,CRC-32,CRC-64, 分别对产生对应 8,16,32,64 位长度的检错码,具有一定的数据压缩映射能力

代码

  • redis-luttuce-crc16



MurmurHash



MurmurHash 是一种非加密型的散列函数,相比加密型散列函数,速度更快,差值最大可以达到几十倍,所以更适用于一般场景的哈希检索操作。MurmurHash 经历过多个版本的迭代,并有多种变种,当前最新版是 MurmurHash3。
且已被广泛应用在多种分布式系统中,比如 Redis, Kafka, Hbase, ElasticSearch

特性

  • MurmurHash2 可以产生 32/64 bit 范围的散列值,MurmurHash3 可以产生 32/128bit 范围的散列值
  • MurmurHash 支持加盐,即支持加一个种子值,而获得不同的 hash 规律,可以防止哈希洪水攻击(Hash-Flooding Attack

代码

public static void main(String[] args) {HashFunction function = Hashing.murmur3_32();System.out.println(function.hashBytes("abcd".getBytes()).asInt());// output = 1139631978}

  • MurmurHash 的原理解析细节比较多,没看懂,就不贴了,这里是一个 Guava 提供的 murmur3 使用例子
  • murmur3 可以使用在一般的哈希值计算,比如短链系统等
  • redis-client-murmurhash
  • guava-murmurhash3

MurmurHash3_最详细的介绍



times31/33




times33

Times33 算法是一个简单的对 “字符串” 进行哈希的函数,又称 “DJB Hash Function” or “DJBX33A”

原理

  • 对字符串 s 进行逐个字符遍历,每次循环乘以 33,并加上 s[i] 字符的 ascii 码 , 然后求和即可
  • 乘数是33, hash 初始值为 5381

代码

private static int times33(String s) {int hash &#61; 5381;char[] val &#61; s.toCharArray();for (int i &#61; 0; i < s.length(); i&#43;&#43;) {hash &#61; ((hash << 5) &#43; hash) &#43; val[i];}// hash is a positive integer&#xff0c;[0,2^31-1]hash &&#61; Integer.MAX_VALUE;return hash;}

  • a * 33 &#61; a * 2^5 &#43; a &#61; a * 32 &#43; a
  • hash &&#61; 0x7fffffff 是为了获得 0 或 正整数&#xff0c;因为 Java 的 int 是有符号整数&#xff0c;只能表示 [0, 2^31 -1] 的整数

why

  • 为什么取 33?
    • 并没有人给于一个比较充分的理由说明&#xff0c;不过通过对[1,256]数值的实验证明&#xff0c;偶数的哈希分布非常差&#xff0c;冲突较高&#xff0c;所以就剩下 128 个奇数&#xff0c;并不是 33 就是最佳的选项
    • 奇素数&#xff0c;哈希分布相比偶数更为良好
  • 初始值为什么是 5381?
    • 没有太多特别的理由&#xff0c;仅仅是在测试中&#xff0c;发现 5381 这个数字&#xff0c;在算法中哈希冲突和分布更好表现不错
    • Reason for 5381 number in DJB hash function?



times31

times31 其实是 Java String hashcode 函数所采用的算法&#xff0c;因其思想类似 times33, 但数值采用 31 ,所以被习惯性称之 times31

原理

  • 原理与 times33 一致&#xff0c;仅仅是乘数和初始值的选择不一样
  • 乘数是 31&#xff0c;初始值是 0

代码

private static int times31(String s) {int hash &#61; 0;char[] val &#61; s.toCharArray();for (int i &#61; 0; i < s.length(); i&#43;&#43;) {hash &#61; ((hash << 5) - hash) &#43; val[i];}return hash;}

  • hash &#61; ((hash <<5) - hash) &#43; val[i] 等价于 hash &#61; 31 * hash &#43; val[i]
  • JDK 显式代码是 31 * hash, 是因为编译器会自行优化

why

  • 为什么取 31
    31 和 33 都是奇素数&#xff0c;理由其实跟 times33 差不多&#xff0c;都是实验数据中&#xff0c;采取比较好的奇素数

参考资料




  • Time33 算法 - &#64;作者&#xff1a;wzcu

  • Reason for 5381 number in DJB hash function?

  • MurmurHash3_最详细的介绍 - &#64;作者&#xff1a;旧夏季 听风起

  • 哈希洪水攻击&#xff08;Hash-Flooding Attack&#xff09;&#xff1f;-&#64;知乎

  • 如果觉得对你有帮助&#xff0c;能否点个赞或关个注&#xff0c;以示鼓励笔者呢&#xff1f;&#xff01;


推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • 开发笔记:对称加密详解,以及JAVA简单实现
     (原)常用的加密有3种1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • MySQL中如何使用MD5加密
    这篇文章主要介绍“MySQL中如何使用MD5加密”,在日常操作中,相信很多人在MySQL中如何使用MD5加密问题上存在疑惑,小编查阅了各式资料,整理出简 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • PHP连接MySQL的2种方法小结以及防止乱码【PHP】
    后端开发|php教程PHP,MySQL,乱码后端开发-php教程PHP的MySQL配置报错信息:ClassmysqlinotfoundinAnswer:1.在confphp.ini ... [详细]
  • php用户注册与,fruit词组
    本文目录一览:1、PHP用户注册2、PHP怎么 ... [详细]
  • yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_i ... [详细]
  • MybatisPlus入门系列(13) MybatisPlus之自定义ID生成器
    数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取 ... [详细]
  • 总结:常见php页面漏洞分析及相关问题解决
    php教程|php手册PHP,phpBB,topic,Socket,SQLphp教程-php手册  从现在的网络安全来看,大家最关注和接触最多的WEB页面漏洞应该是ASP了,在这方 ... [详细]
author-avatar
狗狗狗699_250
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有