[英]hash function in C
我需要创建一些哈希函数...您能帮我吗?
输入是一个数字序列。 您的任务是确定重复多少个数字。
它的数字和字母字符串( * a [] )。 N是输入的位数。
返回重复次数。
int function(char *a[], int n)
{
int i,j;
int same=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(!strcmp(a[i],a[j]))
same++;
}
}
return same;
}
int main(void)
{
char *a[] = {"AA123456", "BA987689", "AA123123", "AA312312", "BB345345", "AA123123"};
printf("Number of duplicates: %d\n", function(a, 6));
return 0;
}
通常,带有质数系数的线性组合(请参阅bézout的恒等式 )并且涉及各个分量和部分哈希,可以得出足够好的结果。
例如,类似
int basile_hash(const char*str) {
int h = 65537;
while (*str) {
h = 75553*h + 5531* (*str);
str++;
};
return h;
}
我并不是说这是一个很好的哈希,但是它可能足以满足您的需求。 所有常数65537、75553、5531都是素数(由bsdgames
Debian软件包中的/usr/games/primes
提供)
您可以使用按位xor ^
进行变体,或者可以考虑多个组件:
h = 65579*str[0] ^ 5507*str[1] + 17*h;
str += 2;
但是,当s[1]
是终止的空字节时,应该特别注意。
另请阅读有关MD5的信息
请注意,许多标准或流行的库为您提供了许多哈希函数。 大多数时候,某些哈希函数的特定选择不是很重要。 另一方面,您仍然可以通过研究和发明良好的哈希函数获得博士学位。 我在此values.c文件中mom_cstring_hash
第150行附近的mom_cstring_hash函数(我想它可能会得到更好的优化,因为对于大字符串,某些指令可能在处理器内部“并行”运行)。
我当然不声称自己是哈希函数方面的专家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.