哈希算法概述
哈希算法(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;
}