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