哈希算法解析

哈希算法概述

哈希算法(Hash Algorithm)是一种将任意长度的输入数据映射为固定长度输出(哈希值)的函数。哈希值通常用于数据完整性校验、密码存储、快速查找等领域。核心特性包括确定性、高效性、抗碰撞性(难以找到两个不同输入产生相同输出)和雪崩效应(微小输入变化导致输出巨大差异)。

常见哈希算法

复制代码
MD5:生成128位哈希值,曾广泛用于校验文件完整性,但因碰撞漏洞已不推荐用于安全场景。
SHA-1:生成160位哈希值,同样存在碰撞风险,逐步被淘汰。
SHA-2系列:包括SHA-256、SHA-512等,安全性更高,广泛应用于SSL/TLS、区块链等。
SHA-3:基于Keccak算法,设计上与SHA-2不同,提供另一种安全选择。

哈希算法应用场景

复制代码
数据校验:通过对比哈希值验证文件传输是否完整(如下载文件的MD5校验)。
密码存储:存储密码的哈希值而非明文,结合盐值(Salt)防止彩虹表攻击。
数据结构:哈希表(HashMap)利用哈希函数实现O(1)时间复杂度的快速查找。
区块链:比特币使用SHA-256计算区块哈希,确保数据不可篡改。

代码示例

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define ULL unsigned long long
const int N = 1e5+5, base = 1007;
string s,T;
int n, cnt;
string ans[N];

void solve() {
	cin >> n >> s;
	ULL hs = 0, tol = 1, len = s.length();
	for(int i=0;i<len;i++) {
		hs = hs * base + s[i];					// H(s) = (s[0] * x^(len-1) + s[1] * x^(len-2) + ...+ s[len-1]) mod MOD 
		tol *= base;							// tol = x ^ len 
	}
	for(int _=0;_<n;_++) {
		cin	>> T;
		ULL ht = 0;
		for(int i=0;i<T.length();i++) {
			ht = ht * base + T[i];				// 加上第 i 个字符的哈希值 
			if(i>=s.length()) 					// 当前超出 模式串 s 的长度 
				ht -= tol * T[i-len];			// 减去 base ^ len * T[r-len]  
			if(ht==hs) {						// 匹配 
				ans[cnt++] = T;					// 计入答案 
				break;
			}
		} 		
	}
	sort(ans,ans+cnt);
	for(int i=0;i<cnt;i++) 
		cout << ans[i] << '\n';
}

int main() {
	ios::sync_with_stdio(NULL),
	cin.tie(nullptr),cout.tie(nullptr);
	solve();
	return 0; 
}
相关推荐
逻辑君6 分钟前
物理学研究报告【20260001】
人工智能·算法
AI科技星15 分钟前
算法联盟·全域数学公理体系下黑洞标量毛发与LVK引力波O4全维理论、求导、证明、计算、验证、分析
人工智能·线性代数·算法·架构·学习方法·量子计算
谙弆悕博士15 分钟前
【附C语言源码】C语言 栈结构 实现及其扩展操作
c语言·开发语言·数据结构·算法·链表·指针·
YuanDaima204816 分钟前
图论基础原理与题目说明
数据结构·人工智能·python·算法·图论·手撕代码
AI人工智能+电脑小能手17 分钟前
【大白话说Java面试题 第53题】【JVM篇】第13题:JVM采用什么算法判断一个对象是否需要被回收?
java·jvm·算法·面试
小赵不会秃头21 分钟前
数据结构Day 06:线性结构、库操作及 Makefile 完整学习笔记
java·linux·数据结构·算法·面试
Shan120531 分钟前
在C++中尝试封装为函数
开发语言·c++·算法
郝学胜-神的一滴42 分钟前
干货版《算法导论》04:渐近复杂度与序列接口实战
java·开发语言·数据结构·c++·python·算法
zzzsde43 分钟前
【Linux】信号处理(3)信号处理&&valatile关键字
linux·运维·服务器·开发语言·算法
洛水水1 小时前
【力扣100题】47.最长递增子序列
算法·leetcode·职场和发展