哈希算法教程(个人总结版)

背景

哈希算法(Hash Algorithm)是一种将任意长度的输入(也称为消息)转换为固定长度的输出(也称为哈希值、散列值、摘要)的算法。哈希算法在计算机科学中有着广泛的应用,包括数据存储、数据检索、数据完整性验证、密码学等。

哈希算法的关键特性

  1. 确定性:相同的输入总是产生相同的输出。
  2. 高效性:计算哈希值的过程应该尽可能高效。
  3. 抗碰撞性:很难找到两个不同的输入具有相同的哈希值。
  4. 抗篡改性:对于给定的哈希值,几乎不可能反推出原始输入。
  5. 均匀分布:哈希值应该均匀分布,尽量避免碰撞。

哈希算法的种类

  1. 散列函数:如常见的哈希表中的散列函数。
  2. 密码学哈希函数:如MD5、SHA-1、SHA-256等,用于数据完整性验证和密码学应用。

散列函数

散列函数用于哈希表(Hash Table)等数据结构中,将数据映射到固定大小的数组上,以实现高效的数据存储和检索。

密码学哈希函数

密码学哈希函数用于验证数据完整性、数字签名等安全应用。常见的密码学哈希函数有:

  • MD5(Message Digest Algorithm 5)
  • SHA-1(Secure Hash Algorithm 1)
  • SHA-256(Secure Hash Algorithm 256-bit)
  • SHA-3(Secure Hash Algorithm 3)

哈希算法的应用

  1. 数据存储和检索:如哈希表、数据库索引等。
  2. 数据完整性验证:如文件校验、数据传输校验等。
  3. 密码学应用:如数字签名、消息认证码等。
  4. 负载均衡:如一致性哈希算法在分布式系统中的应用。

哈希算法的实现

散列函数

简单散列函数

简单散列函数是一种基础的哈希函数,通过对每个字符的ASCII码求和,再取模数组大小,得到哈希值。

def simple_hash(key, size):hash_value = 0for char in key:hash_value += ord(char)return hash_value % size# 示例
key = "example"
size = 10
hash_index = simple_hash(key, size)
print(f"'{key}' 的哈希值为: {hash_index}")
乘法散列法

乘法散列法使用一个常数A(通常取黄金比例),将键值乘以A,再取其小数部分,最后乘以数组大小并取整。

def multiplicative_hash(key, size):A = 0.6180339887  # 常数 A,通常取黄金比例hash_value = 0for char in key:hash_value += ord(char)fractional_part = (hash_value * A) % 1return int(size * fractional_part)# 示例
key = "example"
size = 10
hash_index = multiplicative_hash(key, size)
print(f"'{key}' 的哈希值为: {hash_index}")

密码学哈希函数

MD5 算法

MD5(Message Digest Algorithm 5)是一种广泛使用的密码学哈希函数,产生128位的哈希值。尽管MD5在许多安全应用中已被认为不够安全,但仍然在一些非安全性场景中被广泛使用。

import hashlibdef md5_hash(data):md5 = hashlib.md5()md5.update(data.encode('utf-8'))return md5.hexdigest()# 示例
data = "example"
hash_value = md5_hash(data)
print(f"'{data}' 的 MD5 哈希值为: {hash_value}")
SHA-256 算法

SHA-256(Secure Hash Algorithm 256-bit)是SHA-2(Secure Hash Algorithm 2)家族中的一种,广泛应用于安全性要求较高的场景,如区块链、数字签名等。

import hashlibdef sha256_hash(data):sha256 = hashlib.sha256()sha256.update(data.encode('utf-8'))return sha256.hexdigest()# 示例
data = "example"
hash_value = sha256_hash(data)
print(f"'{data}' 的 SHA-256 哈希值为: {hash_value}")

哈希算法对比

算术均值、几何均值、调和均值与加权均值对比
算法哈希值长度安全性性能应用场景
MD5128位数据校验、非安全性场景
SHA-1160位较弱较快过去的安全应用(已不推荐)
SHA-256256位较慢高安全性场景、区块链
SHA-3可变较慢高安全性场景

优劣势分析

MD5

  • 优点:计算速度快,适合大数据量的快速校验。
  • 缺点:安全性较弱,易受碰撞攻击,不适用于安全性要求高的场景。

SHA-1

  • 优点:比MD5安全性略高。
  • 缺点:仍存在安全漏洞,不推荐用于新的安全应用。

SHA-256

  • 优点:安全性高,广泛应用于区块链和数字签名等高安全性领域。
  • 缺点:计算速度较慢,对资源要求较高。

SHA-3

  • 优点:最新的SHA算法,安全性更高,设计灵活,支持可变长度的哈希值。
  • 缺点:计算速度较慢,对资源要求高。

哈希算法应用实例

文件完整性验证

哈希算法可以用于文件的完整性验证,确保文件在传输或存储过程中没有被篡改。

import hashlibdef calculate_file_hash(file_path, algorithm='sha256'):hash_func = getattr(hashlib, algorithm)()with open(file_path, 'rb') as f:while chunk := f.read(4096):hash_func.update(chunk)return hash_func.hexdigest()# 示例
file_path = 'example.txt'
hash_value = calculate_file_hash(file_path)
print(f"文件 '{file_path}' 的哈希值为: {hash_value}")

数据库索引

哈希算法可以用于数据库的索引,提高数据检索的效率。

class HashTable:def __init__(self, size):self.size = sizeself.table = [[] for _ in range(size)]def _hash(self, key):return hash(key) % self.sizedef insert(self, key, value):hash_key = self._hash(key)key_exists = Falsebucket = self.table[hash_key]for i, kv in enumerate(bucket):k, v = kvif key == k:key_exists = Truebreakif key_exists:bucket[i] = (key, value)else:bucket.append((key, value))def search(self, key):hash_key = self._hash(key)bucket = self.table[hash_key]for k, v in bucket:if key == k:return vreturn None# 示例
hash_table = HashTable(10)
hash_table.insert('key1', 'value1')
hash_table.insert('key2', 'value2')
print(f"key1: {hash_table.search('key1')}")
print(f"key2: {hash_table.search('key2')}")

一致性哈希算法

一致性哈希算法是一种特殊的哈希算法,常用于分布式系统中进行负载均衡。它将节点和数据都映射到一个虚拟的环上,通过环上的位置确定数据存储的节点。

一致性哈希算法实现

import hashlibclass ConsistentHash:def __init__(self, nodes=None, replicas=3):self.replicas = replicasself.ring = dict()self._sorted_keys = []if nodes:for node in nodes:self.add_node(node)def _hash(self, key):return int(hashlib.md5(key.encode('utf-8')).hexdigest(), 16)def add_node(self, node):for i in range(self.replicas):key = self._hash(f'{node}:{i}')self.ring[key] = nodeself._sorted_keys.append(key)self._sorted_keys.sort()def remove_node(self, node):for i in range(self.replicas):key = self._hash(f'{node}:{i}')del self.ring[key]self._sorted_keys.remove(key)def get_node(self, key):if not self.ring:return Nonehash_key = self._hash(key)for key in self._sorted_keys:if hash_key <= key:return self.ring[key]return self.ring[self._sorted_keys[0]]# 示例
nodes = ['node1', 'node2', 'node3']
ch = ConsistentHash(nodes)key = 'my_data_key'
node = ch.get_node(key)
print(f"'{key}' 应该映射到节点: {node}")

结论

哈希算法是计算机科学中不可或缺的重要工具,广泛应用于数据存储与检索、数据完整性验证、密码学等领域。通过对不同哈希算法的学习和实践,可以更好地理解和应用这些技术,提高系统的性能和安全性。在实际应用中,应根据具体需求选择合适的哈希算法,以充分发挥其优势。

通过本教程的详细介绍和代码示例,希望您对哈希算法有了更深入的理解,并能够在实际项目中应用这些技术。

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

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

相关文章

【软考网络工程师-2023年5月上午真题】

1、固态硬盘的存储介质是&#xff1a; 闪存 。 &#xff08;固态硬盘SSD的存储介质是Flash&#xff0c;也叫闪存&#xff0c;U盘中的存储介质也是闪存&#xff1b;机械硬盘HDD的存储介质是磁盘&#xff0c;依靠磁盘转动实现读写&#xff0c;机械硬盘内涵机械臂和磁道&#xff0…

四川汇聚荣聚荣科技有限公司好不好?

在当今科技飞速发展的时代&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;必须具备强大的技术实力和良好的市场口碑。那么&#xff0c;作为一家专注于科技创新的公司&#xff0c;四川汇聚荣聚荣科技有限公司究竟如何呢?接下来&#xff0c;我们将从四个方面进行详…

扔掉 MacBook,挑战带OrangePi出差!

背景 由于工作需要&#xff0c;博主经常会到各大企业的自建机房中私有化部署公司的软件产品。 在某些企业自建机房中&#xff0c;有时给到全新的机器&#xff0c;没有基础环境&#xff0c;甚至有的还无法互联网&#xff0c;而且因为近几年CentOS的停止更新&#xff0c;服务器…

【Linux】Linux的权限_2 + Linux环境基础开发工具_1

文章目录 三、权限3. Linux权限管理修改文件的拥有者和所属组 4. 文件的类型5. 权限掩码 四、Linux环境基础开发工具1. yumyum 工具的使用 未完待续 三、权限 3. Linux权限管理 修改文件的拥有者和所属组 在上一节我们讲到如何更改文件的访问权限&#xff0c;那我们需要更改…

删除最后一个字符 js vue 前端

substring()、slice()、substr() let str ;let str1 "abcdef"; str str1.substring(0, str1.length - 1);let str2 "abcdef"; str str2.slice(0, str2.length - 1);let str3 "abcdef"; str str3.substr(0, str3.length - 1); 官方想废弃…

光伏智慧化运营解决方案的应用和价值

在社会对新能源需求的不断扩大&#xff0c;光伏已经成为了可再生能源的重要组成部分&#xff0c;随着光伏电站数量和规模的不断扩大&#xff0c;相关企业和用户都就开始关注如何能够高效精准的进行电站管理&#xff0c;对此&#xff0c;鹧鸪云提出了光伏智慧化运营解决方案&…

【官方指南】3ds Max中纹理贴图问题及正确解决方案

在使用3ds Max进行设计和制作时&#xff0c;纹理贴图是一个非常重要的环节。然而&#xff0c;许多用户在使用过程中常会遇到各种纹理贴图问题。为此&#xff0c;Autodesk官方提供了一些有效的解决方案&#xff0c;可以解决90%的纹理贴图难题。这里小编都帮大家整理好了&#xf…

简化跨网文件传输摆渡过程,降低IT人员工作量

在当今数字化时代&#xff0c;IT企业面临着日益增长的数据交换需求。随着网络安全威胁的不断演变&#xff0c;网关隔离成为了保护企业内部网络不受外部威胁的重要手段。然而&#xff0c;隔离的同时&#xff0c;企业也需要在不同网络间安全、高效地传输文件&#xff0c;这就催生…

线性回归计算举例

使用正规方程计算&#xff08;一元线性回归&#xff09; import numpy as np import matplotlib.pyplot as plt # 转化成矩阵 X np.linspace(0, 10, num 30).reshape(-1, 1) # 斜率和截距&#xff0c;随机生成 w np.random.randint(1, 5, size 1) b np.random.randint(1,…

vue:动态表格操作栏操作显示隐藏控制

文章目录 动态数据格式子组件接收父组件传递过来的数据 整动态数据格式程 1.调用表格组件的父组件 <template> <Table :PropTableS"PropTableS" ></Table> </template>let PropTableS ref({keyS:{selection:{type:selection,width:50,},…

C++指针、数组越界异常、栈区、堆区,和静态区

文章目录 一、指针引用运算符(&)和引用运算符(*)二、数组越界异常三、C++的栈区、堆区,和静态区一、指针 C ++中指针能够直接操作计算机内存中的数据。 可以根据需要分配和取消分配内存中的任何空间。 指针变量是指向内存中另一个变量所指向的特定地址的变量。 声明一个…

使用 pyhttptest 进行 RESTful API 测试的最佳实践

现在&#xff0c;无论是开发还是使用服务&#xff0c;我们每个人都面临着 REST API 的挑战。同时&#xff0c;我们正处于微服务的流行时代&#xff0c;我们将业务逻辑拆分为多个独立的小服务。这些服务大多遵循 RESTful 原则&#xff0c;并使用 JSON 格式进行通信&#xff0c;因…

Qt项目使用pato mqtt C

一,下载pato mqtt C 源码 git 地址:https://github.com/eclipse/paho.mqtt.c.git git 地址可能下载不下来,提供我的gitee地址 gitee地址:https://gitee.com/chaojidahuaidan2021/paho.mqtt.c.git 二,编译共享库 clone下来后,将项目导入到Qt工程中,此时这是一个cmke工程…

三十一、openlayers官网示例Draw Features解析——在地图上自定义绘制点、线、多边形、圆形并获取图形数据

官网demo地址&#xff1a; Draw Features 先初始化地图&#xff0c;准备一个空的矢量图层&#xff0c;用于显示绘制的图形。 initLayers() {const raster new TileLayer({source: new XYZ({url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/…

Kubernetes和Docker对不同OS和CPU架构的适配关系

Docker Docker官网对操作系统和CPU架构的适配关系图 对于其他发行版本&#xff0c;Docker官方表示没有测试或验证在相应衍生发行版本上的安装&#xff0c;并建议针对例如Debian、Ubuntu等衍生发行版本上使用官方的对应版本。 Kubernetes X86-64 ARM64 Debian系 √ √ Re…

贪心算法[1]

首先用最最最经典的部分背包问题来引入贪心的思想。 由题意可知我们需要挑选出价值最大的物品放入背包&#xff0c;价值即单位价值。 我们需要计算出每一堆金币中单位价值。金币的属性涉及两个特征&#xff0c;重量和价值。 所以我们使用结构体。 上代码。 #include <i…

基于单张图片快速生成Metahuman数字人(模型贴图绑定)的工作流演示

基于单张图片快速生成Metahuman数字人&#xff08;模型贴图绑定&#xff09;的工作流演示 MetahumanModeler, 是我基于facebuilder以及metahuman的理解开发而成&#xff0c;插件可以基于单张图片生成metahuman拓扑结构的面部3d模型&#xff0c;同时生成对应的面部的贴图&#…

【debug】windows11安装WSL+Docker+本地部署cvcat

windows系统安装wsl虚拟机 首先观察是否已启用虚拟化&#xff1a; 在windows应用商店下载wsl 下载好后打开&#xff0c;创建用户名和密码&#xff0c;即可使用&#xff1a; 换源&#xff1a;ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirr…

leetcode231-Power of Two

题目 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#xff1…

在Spring中自定义事件及发布与监听

在Spring框架中&#xff0c;自定义事件及其发布与监听是一个涉及Spring事件机制的过程。Spring提供了一个基于观察者模式的事件发布和监听机制&#xff0c;允许在Spring容器中的组件之间进行松耦合的通信。以下是如何自定义事件以及如何发布和监听这些事件的步骤&#xff1a; …