[数据结构与算法]哈希算法

目录

哈希算法

常见哈希函数:

MD5 (Message Digest Algorithm 5):

SHA-1 (Secure Hash Algorithm 1):

SHA-256 (Secure Hash Algorithm 256-bit):

代码演示:


哈希算法

哈希算法是一种将任意长度的输入数据映射为固定长度的输出数据的算法。哈希函数的主要目标是保证数据的一致性和完整性,即使输入数据发生微小的变化,输出结果也会发生较大的变化。这种特性使得哈希算法在数据存储、密码学、数据完整性验证等领域得到广泛应用。

哈希算法的特点包括:

  1. 固定长度输出: 无论输入数据有多长,哈希算法的输出都是固定长度的。例如,常见的MD5算法输出128位(16字节)的哈希值,SHA-256算法输出256位(32字节)的哈希值。

  2. 唯一性: 不同的输入数据应该映射为不同的哈希值,但由于输出长度是固定的,可能会出现不同的输入映射为相同的哈希值,这被称为哈希碰撞。

  3. 不可逆性: 从哈希值不能逆向推导出原始输入数据。即使两个不同的输入具有相同的哈希值,也不应该能够从哈希值还原出原始数据。

  4. 高效性: 哈希算法的计算应该是高效的,能够在短时间内处理大量数据。

常见哈希函数:

MD5(Message Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)、SHA-256。

MD5 (Message Digest Algorithm 5):

算法原理: MD5是一种基于加密哈希函数的算法,接收任意长度的输入,并输出一个128位(16字节)的哈希值。MD5算法主要由以下四个步骤组成:

  1. 初始化: 初始化四个32位的变量(A、B、C、D),这些变量将存储最终生成的哈希值的四个部分。

  2. 填充: 将输入数据填充到长度符合特定规则的倍数,通常是64位的倍数。填充包括原始消息长度的编码和一个比特"1"的附加。如果消息的位数不是512的倍数,就添加一些零位,直到满足条件。

  3. 处理: 将填充后的数据分割成512位的块,并对每个块进行一系列的操作,包括位运算、逻辑函数和非线性函数。这些操作涉及到四个32位的变量,并进行64轮迭代。

  4. 输出: 将最终处理的结果拼接在一起,形成128位的MD5哈希值。

MD5算法是由Ron Rivest于1991年设计的,但由于其安全性问题,现在不再推荐用于安全敏感的应用。MD5容易受到碰撞攻击,即找到两个不同的输入,使得它们产生相同的MD5哈希值。

SHA-1 (Secure Hash Algorithm 1):

算法原理: SHA-1是一种160位(20字节)的哈希函数,接收输入并输出固定长度的哈希值。SHA-1的步骤如下:

  1. 初始化: 初始化五个32位的变量(A、B、C、D、E),它们将存储最终生成的哈希值的五个部分。

  2. 填充: 类似于MD5,SHA-1对输入进行填充,使其长度符合512位的倍数。

  3. 处理: 将填充后的数据分割成512位的块,并进行80轮迭代。SHA-1的处理过程包括位运算、逻辑函数和非线性函数,但相较于MD5,SHA-1的设计更为安全。

  4. 输出: 将最终处理的结果拼接在一起,形成160位的SHA-1哈希值。

SHA-1曾经是广泛使用的哈希算法,但在2017年之前已经被证明不再足够安全,因为发现了对其的碰撞攻击。

SHA-256 (Secure Hash Algorithm 256-bit):

算法原理: SHA-256是SHA-2家族中的一员,输出256位(32字节)的哈希值。SHA-256的步骤类似于SHA-1,但具有更大的位数和更多的轮数,从而提高了安全性。

  1. 初始化: 初始化八个32位的变量(A、B、C、D、E、F、G、H),它们将存储最终生成的哈希值的八个部分。

  2. 填充: 对输入进行填充,使其长度符合512位的倍数。

  3. 处理: 将填充后的数据分割成512位的块,并进行64轮迭代。SHA-256的处理过程包括位运算、逻辑函数和非线性函数。

  4. 输出: 将最终处理的结果拼接在一起,形成256位的SHA-256哈希值。

SHA-256目前被广泛应用于许多领域,包括数字签名、数据完整性验证等,因为它提供了较高的安全性。

代码演示:

C++编写的简单示例代码,通过哈希表查找长度为10的数组中出现次数最多的数字:

#include <stdio.h>
#include <stdlib.h>#define ARRAY_SIZE 10int findMaxFrequency(int array[], int size) {if (size <= 0) {fprintf(stderr, "Invalid array size.\n");exit(EXIT_FAILURE);}// 使用哈希表存储数字出现的次数int* frequencyMap = (int*)calloc(ARRAY_SIZE, sizeof(int));// 统计数组中每个数字的出现次数for (int i = 0; i < size; ++i) {frequencyMap[array[i]]++;}// 找到出现次数最多的数字int maxFrequency = 0;int resultNumber = array[0]; // 默认结果为数组的第一个数字for (int i = 0; i < ARRAY_SIZE; ++i) {if (frequencyMap[i] > maxFrequency) {maxFrequency = frequencyMap[i];resultNumber = i;}}free(frequencyMap);return resultNumber;
}int main() {// 示例数组int array[ARRAY_SIZE] = {1, 2, 3, 4, 2, 2, 3, 5, 6, 2};// 查找出现次数最多的数字int result = findMaxFrequency(array, ARRAY_SIZE);for(int i=0;i<10;i++){printf("数组数字%d: %d\n",i,array[i]);}// 输出结果printf("出现次数最多的数字: %d\n", result);return 0;
}

 执行结果:

总结哈希算法的常见应用

  1. 密码存储: 哈希算法常用于存储用户密码。而不是直接存储密码本身,系统通常会将密码哈希后存储。当用户登录时,系统会对用户提供的密码进行哈希,并将其与存储的哈希值进行比较,而不是明文密码。常用的密码哈希算法包括SHA-256和bcrypt。

  2. 数字签名: 数字签名使用哈希算法来确保数据的完整性和认证。发送方使用私钥对消息进行哈希,并将哈希值与私钥一起签名。接收方使用发送方的公钥验证签名,并通过哈希比较确保消息的完整性。

  3. 数据完整性验证: 哈希算法用于验证数据在传输过程中是否被篡改。发送方计算数据的哈希值并将其一并发送。接收方接收数据后,再次计算哈希值,如果两个哈希值一致,则数据完整性得到验证,否则说明数据可能被篡改。

  4. 哈希表: 在计算机科学中,哈希表(Hash Table)是一种常见的数据结构,它使用哈希函数将键映射到存储桶中,从而实现高效的数据检索。哈希算法在这里用于确定键的存储位置。

  5. 防止重复: 在分布式系统中,哈希算法用于确定唯一标识符,例如在一组服务器中分配任务或数据。这有助于防止重复处理或存储相同的数据。

  6. 文件校验: 哈希算法可用于生成文件的校验和,以验证文件的完整性。用户可以计算文件的哈希值并与预期的哈希值比较,以确定文件是否被篡改。

  7. 数字证书: 数字证书中使用了哈希算法来确保证书的完整性。证书颁发机构(CA)使用哈希函数对证书进行签名,以确保证书在传输过程中没有被篡改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

Python如何递归删除空文件夹

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹&#xff0c;这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题&#xff0c;其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…

fullcalendar案例

fullcalendar案例 <script srchttps://cdn.jsdelivr.net/npm/fullcalendar6.1.10/index.global.min.js></script><script srchttps://code.jquery.com/jquery-3.6.0.min.js></script> <!-- 引入 jQuery CDN --><script>document.addEventL…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

【前端-VUE】Vue3组件组成部分及组件通信(详解)

一、父子间通信 1.父传子&#xff1a; 2.子传父&#xff1a; 3.什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性 Prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 3.1 props校验 思考&#xff1a;组件的prop…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排&#xff0c;同时快速输出加工图纸和数控加工代码。在壳体外购&#xff0c;没有柜体3D数据的情况下&#xff0c;如何轻松进行母排设计&#xff1f;一起来学习利驰数字母排的钣金功能吧&#xff01; SuperPanel的钣金…

【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

本课程由云贝教育-刘峰老师出品&#xff0c;感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性&#xff0c;同时提高性能。本课程基于当前主流版本Oracle 1…

python 写入csv文件 内容乱码

问题 python 写入csv文件 内容乱码 详细问题 笔者核心代码 import csv # 将数据写入 CSV 文件 csv_file_path "soil_data.csv" header ["经度", "纬度", "土壤类型", "pH值"]with open(csv_file_path, mode"w&q…

【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解

文章目录 0. 前言1. ROI池化的提出背景2. RoI池化的结构与工作原理3. RoI池化的作用及意义4. RoI使用示例 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方…

优化器刺客之limit 1--Order by col limit n 代价预估优化探索

一、现象 order by 排序加了limit后更慢了&#xff1f; test# explain analyze select userid from dba_users where username like %aaaaaaaaaaaaaaaaaa% order by userid ;QUERY PLAN --------------…

ElementUI Form:Radio 单选框

ElementUI安装与使用指南 Radio 单选框 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue 页面效果图 项目里el-radio.vue代码 <script> export default {name: el_radio,data() {return {radio: 1,radio2: 2,radio3: 3,radio4: 上海,radio5: 上海,ra…

12个适合后端程序员的前端框架

前言 今天我们分享12个适合后端程序员的前端框架&#xff0c;本文中的所有前端框架都已经收录到适合后端程序员的前端框架GitHub Issues知识库中&#xff0c;假如大家有更好前端框架推荐欢迎到以下GitHub项目地址留言或者在文末留言&#xff08;注意&#xff1a;排名不分先后&a…

c#鼠标绘制

有用的没用的&#xff0c;用的上的用不上的&#xff0c;能写的不能写的&#xff0c;反正想起来就写了&#xff0c;比如这篇&#xff0c;好像一般也没什么用&#xff0c;emmm&#xff0c;或许&#xff0c;做录制软件的时候可以用一下。 顾名思义&#xff0c;本篇主要就是来实现将…

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路high low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <scr…

幻兽帕鲁服务器游戏怎么升级版本?

幻兽帕鲁服务器游戏怎么升级版本&#xff1f;自建幻兽帕鲁服务器进入Palworld游戏提示“您正尝试加入的比赛正在运行不兼容的游戏版本&#xff0c;请尝试升级游戏版本”什么原因&#xff1f;这是由于你的客户端和幻兽帕鲁服务器版本不匹配&#xff0c;如何解决&#xff1f;更新…

故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab) 支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于分类和回归分析。SVM的主要目标是找到一个最优的超平面(或者在非线性情况下是一个最优的超曲面),将不同类别的样本分开…

Flutter的安装与环境配置

一、下载安装Futter&#xff1a; 1、Flutter中文文档&#xff1a; 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK&#xff1a; Flutter中文文档 里面有&#xff0c;下载完成之后找个文件夹解压出来&#xff0c;最好不要将 Flu…

大数据分析|从七个特征理解大数据分析

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

qiankun子应用静态资源404问题有效解决(遇到了http请求静态文件404、css文件引用图片无法显示、svg图片转换成 base64无法显示等问题)

在&#x1f449;&#x1f3fb; qiankun微前端部署&#x1f448;&#x1f3fb;这个部署方式的前提下&#xff0c;遇到的问题并解决问题的过程 >> 问题现象 通过http请求本地的静态json文件404 css中部分引入的图片无法显示 >> 最开始的解决方式 在&#x1f449;…

微信小程序(二十五)条件判断语句与结构隐藏

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.条件判断语句的演示 2.隐藏结构的演示 源码&#xff1a; index.wxml <view><!-- wx:if和wx:else为条件判断语句 --><text wx:if"{{isLogin}}">已登入的用户</text><tex…