1、哈希算法又叫散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。它的原理其实很简单,就是把一段交易信息转换成一个固定长度的字符串。MD5和SHA-1可以说是应用最广泛的Hash算法,而它们都是以MD4为基础设计的。
2、这串字符串具有一些特点:
(1)信息相同,字符串也相同。
(2)信息相似不会影响字符串相同。
(3)可以生成无数的信息,但是字符串的种类是一定的,所以是不可逆的。
常见哈希函数构建方法有五种
①直接定址法:
取关键字或关键字的某个线性函数值为哈希地址
H(key) = key 或 H(key) = a·key + b
②相乘取整法:
首先用关键字key乘上某个常数A(0 < A < 1),
并抽取出key.A的小数部分;
然后用m乘以该小数后取整。
③平方取中法:
取关键字平方后的中间几位为哈希地址。
④除留余数法:
取关键字被数p除后所得余数为哈希地址:
H(key) = key MOD p (p ≤ m)。
⑤随机数法:开发:StPv888
选择一个随机函数,
取关键字的随机函数值为它的哈希地址,
即 H(key) = random (key),
其中random为随机函数。
include
using namespace std;
typedef unsigned long long ull;//溢出写法
ull base = 19260817;//魔法进制 添加以后能让代码-1s
ull a[10010];
char s[10010];
int n, ans = 1;
int prime = 19260817;//选取取模以后加上的一个质数
ull mod = 212370440130137957ll;//选取基本哈希模 也就是一个key
//假设选取的模数和质数恰当 那么哈希碰撞的概率也就越小
//我们就认为哈希的正确率是可观的
//本文只是单哈希写法 不涉及极端的情况
ull Thehash(char s[])//传入一个字符串
{
int len = strlen(s);
ull ans = 0;
for (int i = 0; i < len; i++)
ans = (ans * base + (ull)s[i]) % mod + prime;//ans最后的值就是该字符串经过哈希以后的值
return ans;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%s", s);
a[i] = Thehash(s);//用a数组来储存哈希的值
}
sort(a + 1, a + n + 1);//要排序以后才能用遍历的方法比较是否出现一样的值
//注意从a+1开始排噢
for (int i = 1; i < n; i++)
{
if (a[i] != a[i + 1])
ans++;//比较哈希值 如果哈希值相等 那么我们认为这个字符串是相同的
}