哈希算法:完整讲解与实现

哈希(hash) 哈希(hash)---C++详解 阅读详情
AI摘要

本文系统性讲解哈希算法,介绍其将任意大小数据转化为固定长度输出的原理、常见特性与用途。对比 MD5、SHA 系列、CRC32 等常见算法,分析安全性与性能。还阐述了哈希算法在文件校验、密码存储等场景的应用,并给出 CRC32 和 SHA - 256 的 C++ 实现。

哈希算法是一种将任意大小的数据输入通过特定的数学规则转化为固定长度输出的技术。它广泛应用于数据完整性校验、加密、密码存储和分布式系统中。在本文中,我们将系统性地讲解哈希算法的原理、特点、应用场景,并通过 C++ 实现代码逐步深入。


在这里插入图片描述

1. 什么是哈希算法?

哈希算法(Hash Algorithm)是一种映射函数,将任意长度的输入数据映射为固定长度的输出数据。这个输出称为哈希值(Hash Value)或消息摘要(Message Digest)。

1.1 哈希算法的通用公式

对于输入数据 x,哈希函数 H(x) 生成的输出 y 满足以下特性:

  • 固定长度输出:无论输入 x 是 1 字节还是 1 GB,输出 y 的长度固定。
  • 不可逆性:无法通过输出 y 反推出输入 x。
  • 高效性:哈希函数应高效地处理大数据。

1.2 哈希算法的常见特性

  1. 确定性:相同的输入 x 总是生成相同的输出 y。
  2. 抗冲突性:不同的输入尽量生成不同的输出。
  3. 雪崩效应:输入的微小变化会导致输出完全不同。
  4. 固定长度输出:如 MD5 生成 128 位,SHA-256 生成 256 位。

1.3 哈希算法的常见用途

  • 数据完整性校验:验证文件在传输过程中是否被篡改。
  • 密码存储:将用户密码以哈希形式存储,提升安全性。
  • 数字签名:生成数据摘要,确保数据真实性。
  • 分布式系统负载均衡:均匀分布数据到不同服务器。

在这里插入图片描述

2. 常见哈希算法比较

以下是几种常见的哈希算法:

算法输出长度安全性性能应用场景
MD5128 位弱(易冲突)快速数据完整性校验
SHA-1160 位较弱较快数据完整性校验
SHA-256256 位高(抗冲突强)较慢密码存储、签名
CRC3232 位弱(简单校验)快速数据传输校验

2.1 MD5 算法简介

  • 特点:将输入映射为固定的 128 位哈希值。快速,但安全性较低。
  • 用途:文件完整性校验。

2.2 SHA 系列算法简介

  • SHA-1:生成 160 位哈希值,比 MD5 更安全,但已被淘汰。
  • SHA-256:更安全的算法,生成 256 位哈希值,广泛用于密码学。

2.3 CRC32 算法简介

  • 特点:快速计算,生成 32 位校验值,主要用于数据传输。
  • 用途:网络协议中的数据完整性验证。

3. 哈希算法的实现原理

以下通过 C++ 实现多个常见哈希算法,逐步解析其工作原理。

3.1 CRC32 算法实现

CRC32 是一种基于多项式除法的校验算法。以下为其 C++ 实现:

#include <iostream>
#include <string>
#include <vector>

unsigned int crc32(const std::string& data) {
    unsigned int crc = 0xFFFFFFFF;
    const unsigned int polynomial = 0xEDB88320;

    for (unsigned char byte : data) {
        crc ^= byte;
        for (int i = 0; i < 8; ++i) {
            if (crc & 1) {
                crc = (crc >> 1) ^ polynomial;
            } else {
                crc >>= 1;
            }
        }
    }

    return ~crc;
}

int main() {
    std::string input = "Hello, World!";
    unsigned int hash = crc32(input);
    std::cout << "CRC32: " << std::hex << hash << std::endl;
    return 0;
}

输出示例:

CRC32: 1c291ca3

3.2 SHA-256 算法原理

SHA-256 使用逻辑运算、位移和压缩函数生成 256 位哈希值。其核心步骤包括:

  1. 消息分块:将输入分成 512 位块。
  2. 初始化哈希值:使用 8 个固定的初始哈希值。
  3. 迭代压缩:对每块数据进行逻辑运算和位操作。
  4. 输出结果:拼接 8 个 32 位哈希值。

以下是简单的 SHA-256 C++ 实现(使用库):

#include <iostream>
#include <iomanip>
#include <openssl/sha.h>

std::string sha256(const std::string& data) {
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256(reinterpret_cast<const unsigned char*>(data.c_str()), data.size(), hash);

    std::stringstream ss;
    for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
        ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);
    }

    return ss.str();
}

int main() {
    std::string input = "Hello, World!";
    std::string hash = sha256(input);
    std::cout << "SHA-256: " << hash << std::endl;
    return 0;
}

输出示例:

SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b7748722cfcbd35a5

4. 哈希算法的比较分析

4.1 安全性分析

  • CRC32:快速但安全性低,易发生冲突。
  • MD5:速度快但不安全,已被淘汰。
  • SHA-256:高安全性,适合密码学场景。

4.2 性能分析

  • CRC32 的计算速度最快,适合大规模数据校验。
  • SHA 系列由于复杂性更高,计算速度相对较慢。

5. 哈希算法的应用场景

5.1 文件完整性校验

使用 MD5 或 SHA-256 验证文件传输后的完整性。

5.2 密码存储

将用户密码的哈希值存储到数据库中,避免泄露明文密码。

5.3 数据签名与验证

通过哈希值生成数据摘要,与签名算法结合确保数据未被篡改。


6. 总结与实践

通过本文,你应该对哈希算法的原理、特性以及具体实现有了全面的理解。以下是关键点:

  • 固定长度输出与不可逆性是哈希算法的核心特点。
  • CRC32 适合快速校验,SHA-256 适合安全场景。
  • C++ 提供了丰富的库支持实现常见哈希算法。

通过实践 CRC32 和 SHA-256 的 C++ 实现,你可以更深入理解哈希算法在真实场景中的应用。如果对更高级的哈希算法或优化感兴趣,可以进一步研究如 SHA-3 或 Blake2。

密码学基础(一)——哈希算法 由于哈希算法的单向性,可以从前一个数据块原文计算出下一个数据块所用的哈希值输入,但已知一个哈希值输入,难以反推出所有可能的数据块原文。哈希算法:哈希算法不可逆,包括:MD4、MD5、hash1、ripeMD160、SHA256、SHA3、Keccak256、国家标准SM3(国家密码管理局)哈希加“盐”(salt),所谓加“盐”,就是在明文的随机位置加上一串随机的字符串再进行hash,防止彩虹表攻击。加密/解密算法:加密解密算法可逆,但是必须要有秘钥,对称加密,非对称加密,数字签名算法DSA。 阅读详情

相关推荐

C#哈希算法实战:MD5、SHA1、SHA256、SHA512实现与避坑指南

哈希算法是一种将任意长度数据映射为固定长度指纹的不可逆技术,其核心原理包括确定性、抗碰撞性和单向性。在数据校验、密码存储和接口签名等场景中,哈希算法能有效保障数据完整性与安全性。C#通过System.Security.Cryptography命名空间提供MD5、SHA1、SHA256、SHA512等实现,开发者需注意编码统一、十六进制转换、加盐处理及固定时间比较等细节。本文系统梳理了这些算法在C#中的代码落地、性能对比与选型建议,并针对密码存储、接口签名等实际项目中的常见陷阱给出避坑方案。

weixin_42539414的博客 116

hash算法原理详解

一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。 使用哈希查找有两个步骤: 1. 使用哈希函数将被

至道 25万+

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

哈希算法(Hash Algorithm)是一种将任意长度的输入(也称为消息)转换为固定长度的输出(也称为哈希值、散列值、摘要)的算法。SHA-256(Secure Hash Algorithm 256-bit)是SHA-2(Secure Hash Algorithm 2)家族中的一种,广泛应用于安全性要求较高的场景,如区块链、数字签名等。散列函数用于哈希表(Hash Table)等数据结构中,将数据映射到固定大小的数组上,以实现高效的数据存储和检索。哈希算法可以用于数据库的索引,提高数据检索的效率。

年糕的博客 5714

常见的hash算法及其原理

 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。   哈希表是根据设定...

Beyond_2016的博客 28万+

Mamba-ST实战:用状态空间模型实现艺术风格迁移的5个关键步骤

本文详细介绍了如何使用Mamba-ST状态空间模型实现高效的艺术风格迁移,涵盖环境配置、数据预处理、模型架构、训练策略和推理优化等5个关键步骤。Mamba-ST基于SSM(状态空间模型)构建,在保持生成质量的同时显著降低计算复杂度,为风格迁移领域提供了新的解决方案。

weixin_29163581的博客 353

Matlab2021a破解版安装与激活实战教程(含详细步骤截图)

本文详细介绍了MATLAB R2021a的正版安装流程与核心功能优化,包括系统要求、安装步骤、性能调优及深度学习工具箱的应用。通过实战教程和代码示例,帮助用户高效搭建开发环境并掌握关键技术,特别适合工程计算与科学研究的专业人士。

vvv99的博客 456

哈希算法与二叉树

哈希算法 一. 基本含义: 哈希算法的主要作用 1:独一无二的 2:数据是完整的 哈希算法的分类 1:普通哈希。 2:加密哈希:。 二叉树 啥也不说了,直接上代码: public class TreeNode { // 左节点(儿子) private TreeNode lefTreeNode; // 右节点(儿子) private TreeNode ...

Nostalgiaxzh的博客 519

Docker容器化部署Ceph集群:从零搭建高可用分布式存储

本文详细介绍了如何使用Docker容器化部署Ceph集群,从零搭建高可用分布式存储系统。通过环境一致性、快速扩容和资源隔离等优势,Docker显著提升了Ceph集群的部署效率和运维便捷性。文章涵盖硬件规划、镜像选择、单节点部署、多节点扩展及性能调优等实战内容,帮助开发者快速掌握分布式存储系统的容器化部署技巧。

weixin_29081101的博客 421

哈希算法总结

之前学密码学的时候一直对哈希算法一知半解,工作中也经常用到(比如文件校验、存密码),趁着周末把这块整理一下。

elite1022的博客 572

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1314

Magisk如何针对性隐藏Root避免被检测

Magisk隐藏特征码有两种途径,一种是通过插件,一种是定制源码。插件的方式相对简单,但是使用范围也有限,好处是成本低好上手。定制源码难度大,成本高,好处是稳定,后续也好更新维护。

zhonglunshun的专栏 1万+

Linux C++学习笔记:从std::hash到sha256sum的哈希实战

哈希(Hash)是计算机科学中从任意数据生成定长指纹的核心技术,在C++编程与Linux运维中均有广泛应用。在C++层面,std::hash与unordered_map实现了高效的键值映射与去重,负载因子与哈希冲突直接决定容器性能;在Linux命令行,sha256sum等工具通过文件指纹实现数据完整性校验。理解哈希函数、冲突解决、rehash等原理,能帮助开发者设计高性能缓存、一致性哈希等系统。本文结合实际代码与命令行实操,梳理C++哈希容器和文件哈希校验的完整学习路径,适合正在学习Linux后台开发或准备

weixin_32642109的博客 258

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 628

哈希的“七十二变”——从小白到进阶的完整指南

哈希(Hash),就是把任意长度的数据(比如一句话、一个文件、一张图片)通过一个算法“压缩”成固定长度的字符串,这个字符串就是哈希值,也叫“数字指纹”。确定性:同样的输入,永远得到同样的输出高效性:计算速度极快抗碰撞性:不同输入几乎不可能产生相同输出单向性:无法从哈希值反推原始数据(就像你知道指纹长什么样,但没法反推出那个人是谁)一句话理解:哈希就像一台“绞肉机”——整只鸡(原始数据)进去,出来的永远是同样粗细的“肉馅”(哈希值),而且你没法把这团肉馅变回那只鸡。

qq_51553749的博客 398

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 240

Isaac Sim/Lab & ROS2 入门教程 —— 宇树人形机器人 H1 强化学习策略部署

本文介绍了如何通过ROS2和IsaacSim运行H1人形机器人的强化学习运动策略。主要内容包括:1)设置机器人关节配置和初始位置;2)添加IMU传感器;3)配置ROS2节点以发布观测数据和接收动作指令;4)创建模拟环境并发布ROS时钟;5)最终运行ROS2策略实现对机器人的键盘控制。文中详细说明了关节参数设置、传感器配置、ROS2节点创建等关键步骤,并提供了注意事项和验证方法。完成配置后,用户可通过键盘指令控制机器人在平坦地形上的运动。

2506_90492529的博客 2169

完整区块链开发指南:Programming Blockchains Step-by-Step从理论到实践

Programming Blockchains Step-by-Step 是一个从零开始构建区块链的实践指南项目,通过循序渐进的方式帮助开发者理解区块链核心原理并掌握实际开发技能。本指南将带你从最基础的加密哈希算法开始,逐步构建完整的区块链系统。 ## 为什么选择从零开始学习区块链开发? 区块链技术作为分布式系统和密码学的完美结合,其核心原理并不复杂。通过亲手构建区块链,你将获得: - **

gitblog_00519的博客 469

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

哈希算法工程实践:选型、校验、口令存储与排错指南

哈希算法(散列函数)把任意长度输入压缩为固定长度摘要。其原理依赖确定性、抗碰撞性与雪崩效应:输入轻微变化即导致摘要显著改变,且无法从摘要反推原文。技术价值在于用极短指纹代替整份数据的昂贵比对,把一致性判断变成低成本字符串比较。工程中,SHA-256 因抗碰撞强度与生态兼容性常用于文件校验、HMAC 和内容寻址;一致性哈希借助虚拟节点缓解节点增减引发的缓存失效。应用场景覆盖下载包完整性校验、数据库迁移比对、用户口令存储、缓存集群节点分配与去重系统。面对 MD5/SHA-1 碰撞风险、慢哈希参数配置、文本模式读

weixin_29323273的博客 245

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

默克尔树从原理到代码:Merkle Proof与数据完整性验证

在数据校验与分布式系统中,如何高效验证一组数据是否被篡改始终是核心问题。哈希树(Hash Tree)通过将数据哈希逐层折叠为唯一根摘要,实现了对集合成员关系的低成本证明。默克尔树(Merkle Tree)作为最经典的认证树结构,利用SHA-256等哈希函数构建二叉哈希树,将证明长度从O(n)压缩至O(log n)。工程实践中,基于Merkle Proof的路径验证机制,使得客户端无需持有全部数据即可验证单条数据的真实性,广泛应用于区块链交易验证、文件完整性校验、证书透明度等场景。本文从哈希折叠原理出发,结合

weixin_33947521的博客 305

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java中MD5加密的三种实现方式与最佳实践

哈希算法是计算机安全领域的基础技术,它将任意长度的数据映射为固定长度的摘要值,具有单向性和抗碰撞性等核心特性。MD5作为一种经典的哈希算法,其原理基于Merkle-Damgård结构,通过多轮位运算生成128位哈希值。尽管在密码学领域已被更安全的SHA-256等算法取代,但在数据完整性校验、文件验证等非对抗性场景中,MD5仍因其实现简单、计算快速而具有实用价值。在Java开发中,开发者可以通过java.security.MessageDigest标准库、Apache Commons Codec工具包以及Sp

weixin_34081595的博客 374

【c++篇】:探索哈希表--数据结构中的独特存在,打开数据组织与查找的新视界

哈希表(Hash Table)是一种非常重要的数据结构,它利用哈希函数将键值key映射到表中的一个位置,从而实现快速的1插入,删除和查找操作。哈希表的核心思想是通过空间换时间,即通过开辟一定的空间资源来实现接近O(1)的平均时间复杂度操作。下面将会详细讲解哈希表的概念,原理以及代码实现。

2301_82347435的博客 2322

哈希表(Hash Table)从原理到实现:一篇带你彻底搞懂

哈希表用哈希函数将Key映射到位置,实现O(1)查找。解决冲突两种方式: (1)开放定址(线性探测):数组存数据,用状态标记(EMPTY/EXIST/DELETE),负载因子≤0.7,扩容用质数表。 (2)链地址(哈希桶):数组存链表头,冲突挂链表,负载因子≤1,扩容时搬移旧节点(高效),删除真删。 字符串用BKDR哈希(乘131),通过仿函数+特化支持泛型。开放定址缓存友好,链地址更灵活,是unordered_map底层基础。

2402_88289386的博客 373

从原理到实现:C++手写哈希表与unordered_map实战指南

哈希表是计算机科学中最基础也最高效的数据结构之一,其核心思想是通过哈希函数将任意类型的键映射为数组下标,再配合冲突处理机制,实现平均O(1)的查找、插入与删除。这项技术广泛应用于缓存系统、字典容器、数据库索引等需要频繁键值访问的场景。理解哈希表,不能只停留在“会用”层面,更要明白负载因子、rehash扩容、哈希函数选型这些决定性能的关键细节。本文以C++为背景,从零手写一个基于链地址法的哈希表,完整展示插入、查找、删除的工程实现,并对照std::unordered_map分析性能差距,最后指出迭代器失效、长

weixin_31742871的博客 277

【C++STL】哈希表(HashTable)

什么是哈希表?哈希表是一种通过键(Key)来直接访问值(Value)的数据结构,它利用一个叫做哈希函数的魔法公式,把任意大小的键(比如一个字符串、一个数字或一个对象)转换成一个固定大小的数字,这个数字被称为哈希值或哈希码。然后,用这个哈希值作为数组的索引,将值存储在这个索引对应的数组位置上。这个过程就像给每个键分配一个唯一的座位号(哈希值),然后告诉它:你的数据就放在这个号码的座位上。当你想找这个数据时,只需要用同样的规则再算一次座位号,就能直接走过去拿到它,而不用一个个座位去问。

2301_80224556的博客 1584

C++:哈希表实现

面对不可避免的哈希冲突,主流有两大解决方案:开放定址法与链地址法。开放定址法不额外开辟空间,通过线性探测寻找空闲位置;链地址法利用链表挂载冲突元素。本文将分别手写两种哈希表,拆解冲突处理、负载因子阈值、扩容重哈希、增删查核心逻辑,带你彻底理解哈希表底层实现原理。

2501_93746590的博客 196

哈希表入门教程:从零搭建完整结构

int key;//键int value;//值//用于解决指针冲突}Node;

2601_95434527的博客 250
上一篇: 构造函数、析构函数、拷贝函数与移动函数概述
下一篇: 深入解析 Yocto 项目的层模型与元数据层
嵌入式孙老师
博客等级 码龄7年 5686粉丝 898原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值