初学hash
hash定义:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的函数。
有一道很经典的题目
uva 10391 Compound Words
这道题当然有别的简洁的方法,不过可以这样:把所有的字符串都用hash函数转换成特定的某个数字,做成字典,然后就好做了
例如:
a
97
alien
53987
born
112833
less
102269
lien
49074
never
112124
nevertheless
3090
new
101060
newborn
33605
the
84401
zebra
45994
这个方法应该有两个要求必须实现:1.转换成的数字要唯一,2.转换成的数字不能超过特定长度
int hash(char a[])
{
long int seed=104; //seed的值可以任意给
long int hash=0;
for(int i=0;i<sizeof(a);i++)
{
hash=hash*seed+a[i];
}
return (hash&P)%120000; //P定义为0x7fffffff //由于输入最多有120000,所以mod120000避免了碰撞
}