我需要创建一些散列函数......你能帮助我吗?
输入是一系列数字。您的任务是确定重复的数字的数量。
它的数字和字母串( * 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;
}
答案 0 :(得分:2)
阅读hash functions上的wikipage&amp; hash tables
通常,与素数系数的线性组合(参见bézout's identity)并涉及组件和部分哈希,可以得到足够好的结果。
例如,像
int basile_hash(const char*str) {
int h = 65537;
while (*str) {
h = 75553*h + 5531* (*str);
str++;
};
return h;
}
我不是声称这是一个非常好的哈希,但它可能足以满足您的需求。所有常量65537,7555,5531都是素数(由/usr/games/primes
Debian软件包中的bsdgames
给出)
您可以使用按位xor ^
制作变体,或者您可以考虑多个组件:
h = 65579*str[0] ^ 5507*str[1] + 17*h;
str += 2;
但你应该关心 - s[1]
是终止空字节的特殊情况。
另请阅读MD5
请注意,许多标准库或流行库为您提供了许多哈希函数。大多数情况下,某些散列函数的特定选择并不是非常重要。另一方面,你仍然可以获得博士学位和发明良好的哈希函数。我在这个values.c文件中有另一个,函数mom_cstring_hash
靠近第150行(我想它可能会更好地优化,因为对于大字符串,某些指令可能会运行&#34;并行&#34 ;在处理器内部。)
我当然不会声称自己是哈希函数的专家。