繁体   English   中英

C中的哈希函数

[英]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;
}

阅读有关哈希函数哈希表的Wikipage。

通常,带有质数系数的线性组合(请参阅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函数(我想它可能会得到更好的优化,因为对于大字符串,某些指令可能在处理器内部“并行”运行)。

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

在自由软件库(例如GlibQt等)中研究哈希函数的源代码。另请参见gperf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM