C中的哈希函数

问题描述 投票:-1回答:1

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

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

它的数字和字母串(* 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;
}
c hash
1个回答
2
投票

阅读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(我想它可能会更好地优化,因为对于大字符串,一些指令可能在处理器内“并行”运行)。

我当然不认为是散列函数的专家。

研究values.cmom_cstring_hash等自由软件库中哈希函数的源代码。参见Glib

© www.soinside.com 2019 - 2024. All rights reserved.