密码学 | 蓄势待发!说说什么是散列算法?

简介: 密码学 | 蓄势待发!说说什么是散列算法?

前言


  • 在计算机科学中,散列算法 的应用场景有很多,例如:散列表的散列函数、消息完整性验证的消息摘要算法,除此之外你还知道哪些应用场景呢?
  • 在这篇文章里,我将带你列举散列算法的 基本要求 & 应用场景。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。


目录


image.png

1. 概述


1.1 散列函数的定义


散列算法(Hash算法,又译哈希算法) 是一种将任意长度输入转换为固定长度输出的算法,输出的结果就是散列值。


散列算法一定是 压缩映射,即:值域会远小于输入值域。例如,MD5的输出散列值为

128 位,SHA256的输出散列值为 256 位。


image.png

1.2 散列算法的性质


散列算法有很多,但是都要满足以下性质 & 要求:


性质 描述
单向性 通过散列值无法反推输入数据
一致性 同一个输入数据,计算后的散列值总是相同的
高效性 散列运算过程尽量快速 & 高效
随机性 散列值在输出值域的分布尽量随机
输入敏感性 相似的数据,计算后的散列值差别很大



2. 散列冲突


2.1 什么是散列冲突?


上一节提到,散列算法是压缩映射(输出值域远小于输入值域),因此肯定会存在两个甚至多个输入数据映射到同一个散列值的情况,这就是发生了 散列冲突(又称散列碰撞,Hash Collision)


需要注意的是,散列冲突是无法完全避免的,这其实只要用鸽巢原理(又称:抽屉原理)就很好理解了,假设有 10 个鸽巢,现有 11 只鸽子,无论分配多么平均,也肯定有一个鸽巢里有两只甚至多只鸽子。


举个例子,Java中的字符串"Aa""BB"的散列值就冲突了:


String str1 = "Aa";
String str2 = "BB";
System.out.println(str1.hashCode());  2112
System.out.println(str2.hashCode());  2112 散列冲突
复制代码


既然散列冲突是无法完全避免的,那么只能采取应对措施,主要有两种:降低概率 & 处理冲突


2.2 降低散列冲突概率


降低散列冲突概率的思路主要有:

  • 1、优化散列算法前面提到了散列算法的随机性:散列值在输出值域的分布尽量随机。这是为了避免出现“堆积”现象,即散列值集中于输出值域的某一块区域,这种情况无疑会增大冲突概率。
  • 2、扩大输出值域在输入值域相对稳定的情况下,扩大输出值域可以降低冲突概率。例如SHA的散列值长度就比MD5长,相应的冲突概率更低。HashMap 在达到阈值时执行扩容,本质上也是扩大了输出值域。


2.3 处理散列冲突


《数据结构 | 散列表是如何避免散列冲突的?》中,我们将讨论散列表中的解决方案。


3. 散列算法的应用场景


Editting...


4. 总结


  • 散列算法是一种将任意长度输入转换为固定长度输出的算法,由于是压缩映射,因而无法避免散列冲突。
目录
相关文章
|
5月前
|
算法 安全 网络安全
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。
|
6月前
|
算法 安全 Java
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
|
6月前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
240 1
|
5月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
6月前
|
存储 算法
数据结构和算法——了解哈希表(哈希查找、散列的基本思想)
数据结构和算法——了解哈希表(哈希查找、散列的基本思想)
52 0
|
7月前
|
存储 缓存 算法
【数据结构查找算法篇】----散列查找【实战项目】
【数据结构查找算法篇】----散列查找【实战项目】
101 10
|
7月前
|
缓存 算法 Java
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
234 0
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
|
7月前
|
算法 安全 网络安全
HTTPS加密原理解析:保障通信安全的密码学算法
HTTPS加密原理解析:保障通信安全的密码学算法
732 0
|
7月前
|
存储 缓存 算法
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)(下)
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
61 0
|
7月前
|
算法 Java BI
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)(上)
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
92 0