当前位置: 首页 > news >正文

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

背景

哈希算法(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}")

结论

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

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

相关文章:

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

背景 哈希算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的输入&#xff08;也称为消息&#xff09;转换为固定长度的输出&#xff08;也称为哈希值、散列值、摘要&#xff09;的算法。哈希算法在计算机科学中有着广泛的应用&#xff0c;包括数据存储、数据检索…...

Nocobase快速上手 -第一个collection

本文记录Nocobase中如何创建collection&#xff0c;以及如何将collection展示到页面中&#xff0c;并且配置CRUD相应的操作. Collection 在NocoBase中&#xff0c;collection&#xff08;集合&#xff09;是用来组织和存储各种数据的容器&#xff0c;如订单、产品、用户、评论…...

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性

这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数&#xff1f;1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…...

循序渐进Docker Compose

文章目录 1.概述1.1 Docker Compose 定义1.2 Docker Compose背景1.3 Docker Compose核心概念 2.安装2.1 Official Repos2.2 Manual Installation2.3 v1.x 兼容性 3. YAML 配置说明3.1 Services3.2 Volumes & Networks 4. 解析 Service4.1 Pulling一个Image4.2 Building一个…...

怎样查看JavaScript中没有输出结果的数组值?

在JavaScript中&#xff0c;可以方便地定义和使用数组&#xff0c;对于已经定义的数组&#xff0c;怎样查看其值呢&#xff1f; 看下面的示例&#xff0c;并运行它。 上面的示例中&#xff0c;标签不完整&#xff0c;请补充完整再试运行。你知道少了什么标签么&#xff1f; 注…...

强化学习学习笔记-李宏毅

Policy Gradient actorenvreward function&#xff0c;env和reward是不能控制的&#xff0c;唯一可以变的是actor&#xff0c;Policy π \pi π是一个网络&#xff0c;参数为 θ \theta θ&#xff0c;输入是当前的观察&#xff0c;输出是采取的行为&#xff0c;例如游戏中输…...

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.8-3.9

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …...

SQL 语言:数据控制

文章目录 概述授权&#xff08;GRANT)销权&#xff08;REVOKE&#xff09;总结 概述 SQL语言中的数据控制权限分配是数据库管理的重要组成部分&#xff0c;它涉及到如何合理地为用户分配对数据库资源的访问和使用权限。 权限类型&#xff1a;在SQL中&#xff0c;权限主要分为…...

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV&#xff1a;区块链的黑暗森林法则 01 &#x1f4a1;TL;DR 这篇文章介绍了区块链中的最大可提取价值&#xff08;MEV&#xff09;概念&#xff0c;MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利&#xff0c;但也导致网络拥堵和交易费用增加。为了…...

正点原子延时函数delay_ms延时失效的原因

1、问题陈述 今天在测试小车程序的时候使用了如下代码&#xff0c;发现延时并没有达到期望的4s&#xff0c;而是仅仅延时了0.4s左右&#xff0c;本来以为少加了个0&#xff0c;最后在我多次测试下来&#xff0c;发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,60…...

MySQL 满足条件函数中使用查询最大值函数

在实际的数据库操作中&#xff0c;我们常常需要根据某些条件找到最大值并据此进行下一步的操作。例如&#xff0c;在一个包含订单信息的表中&#xff0c;可能需要找到特定客户的最大订单金额&#xff0c;并据此进行某些统计或决策。MySQL 提供了多种函数和查询方法&#xff0c;…...

Java | Leetcode Java题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {Queue<TreeNode> q new LinkedList<TreeNode>();q.offer(u);q.offer(v);while (!q.…...

【区块链】智能合约漏洞测试

打开Ganache vscode打开智能合约漏洞工程 合约内容 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function with…...

大模型主流 RAG 框架TOP10

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...

第八次javaweb作业

我们小组课程设计的题目是&#xff1a;超市管理系统&#xff0c;我认领的模块是&#xff1a;商品信息管理 controller package com.example.supermarker.controller;import com.example.supermarker.pojo.MerchInfo; import com.example.supermarker.pojo.PageBean; import c…...

js积累四 (读json文件)

function ReadRadioJson() {var url "../radio.json" //json文件url&#xff0c;本地的就写本地的位置&#xff0c;如果是服务器的就写服务器的路径var request new XMLHttpRequest();request.open("get", url, false); //设置请求方法与路径request.sen…...

关于我转生从零开始学C++这件事:升级Lv.25

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ OK了老铁们&#xff0c;又是一个周末&#xff0c;大伟又来继续给大家更新我们的C的内容了。那么根据上一篇博…...

mysql中text,longtext,mediumtext区别

文章目录 一.概览二、字节限制不同三、I/O 不同四、行迁移不同 一.概览 在 MySQL 中&#xff0c;text、mediumtext 和 longtext 都是用来存储大量文本数据的数据类型。 TEXT&#xff1a;TEXT 数据类型可以用来存储最大长度为 65,535(2^16-1)个字符的文本数据。如果存储的数据…...

IP协议说明

文章目录 前言一、IP协议的简介二、IP数据报1.IP 数据报结构2.IP 数据报的分片解析3.IP 数据报的分片重装 三、IP 数据报的输出四、IP 数据报的输入 前言 IP 指网际互连协议&#xff0c; Internet Protocol 的缩写&#xff0c;是 TCP/IP 体系中的网络层协议。设计 IP 的目的是…...

第13章 层次式架构设计理论与实践

层次式架构的核心思想是将系统组成为一种层次结构&#xff0c;每一层为上层服务&#xff0c;并作为下层客户。其实不管是分层还是其他的架构都是为了解耦&#xff0c;更好的复用&#xff0c;只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…...

FreeRtos进阶——消息队列的操作逻辑

消息队列&#xff08;queue&#xff09; 在不同的任务之间&#xff0c;如果我们需要互相之间通信&#xff0c;使用全局变量进行通信&#xff0c;是一种不安全的通信的方式。为保证线程安全&#xff0c;我们需要引入消息队列的通信方式。 粗暴的消息队列 为保证线程的安全&am…...

WordPress搭建流程

1. 简介 WordPress 是一个 PHP 编写的网站制作平台。WordPress 本身免费,并且拥有众多的主题可以使用,适合用于搭建个人博客、公司官网、独立站等。 2. 环境准备 2.1 WordPress 下载 WordPress 可以在 Worpress中文官网 下载(如果后续要将后台调成中文的话,一定要从中文…...

数据集004:跌倒检测数据集 (含数据集下载链接)

数据集简介&#xff1a; 该数据集为跌倒检测数据集&#xff0c;属于imageclassify任务&#xff0c;分为fall和nofall两大类&#xff0c;累计共1000张图片&#xff0c;均为人工标注 xml格式&#xff0c;可用于yolo训练。 数据集链接&#xff1a;跌倒检测数据集&#xff08;1000…...

苹果与OpenAI合作在即:iOS 18中的ChatGPT引发期待与担忧

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Android 逆向学习【2】——APK基本结构

APK安装在安卓机器上的&#xff0c;相当于就是windows的exe文件 APK实际上是个压缩包 只要是压缩的东西 .jar也是压缩包 里面是.class(java编译后的一些东西) APK是Android Package的缩写,即Android安装包。而apk文件其实就是一个压缩包&#xff0c;我们可以将apk文件的后…...

你对仲裁裁决不服怎么办?我教你四个狠招!

你对仲裁裁决不服怎么办&#xff1f;我教你四个狠招&#xff01; 这个标题是什么意思呢&#xff1f;也就是说&#xff0c;当你&#xff08;或用人单位&#xff09;向劳动仲裁委提出仲裁申请后&#xff0c;但劳动仲裁结果没有维护你的权益&#xff0c;或者你不满意&#xff0c;…...

绿色智能:低代码开发在AI机器学习中的深度应用与实践案例

随着科技的飞速进步&#xff0c;软件开发的方式也在不断演变。其中&#xff0c;低代码开发作为一种新兴的编程方式&#xff0c;以其高效、便捷的特性受到了广泛关注。同时&#xff0c;AI机器学习技术的发展也为软件开发带来了新的可能。本文将简要介绍低代码开发的概念&#xf…...

《NoSQL数据库技术与应用》 文档存储数据库MongoDB

搜索 《NoSQL数据库技术与应用》 教学设计 课程名称&#xff1a;NoSQL数据库技术与应用 授课年级&#xff1a; 20xx年级 授课学期&#xff1a; 20xx学年第一学期 教师姓名&#xff1a; 某某老师 2020年5月6日 课题 名称 第2章 文档存储数据库MongoDB 计划学时 4 课时 内容 分…...

设置AXI主寄存器切片和AXI数据FIFO

设置AXI主寄存器切片和AXI数据FIFO 打开MHS文件&#xff0c;并为每个AXI主机设置启用寄存器切片/启用数据FIFO。到 确定正确的设置&#xff0c;使用下表中的信息搜索MHS。 进行搜索时&#xff0c;将<intf_name>替换为相关的BUS_INTERFACE名称。 例如&#xff0c;BUS_INTE…...

Golang协程和通道

文章目录 协程&#xff08;goroutine&#xff09;基本介绍GMP模型协程间共享变量 通道&#xff08;channel&#xff09;基本介绍channel的定义方式channel的读写channel的关闭channel的遍历方式只读/只写channelchannel最佳案例select语句 协程&#xff08;goroutine&#xff0…...