C中的哈希函数

时间:2014-11-10 19:40:41

标签: c hash

我需要创建一些散列函数......你能帮助我吗?

输入是一系列数字。您的任务是确定重复的数字的数量。

它的数字和字母串( * 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;
}

1 个答案:

答案 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 ;在处理器内部。)

我当然不会声称自己是哈希函数的专家。

还研究自由软件库中的哈希函数的源代码,例如GlibQt等....另请参阅gperf