首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造哈希表/哈希函数

构造哈希表/哈希函数
EN

Stack Overflow用户
提问于 2010-06-03 06:58:03
回答 4查看 5.2K关注 0票数 5

我想构建一个哈希表,在从1到15字节的字节序列(字符串)中查找关键字。

我想存储一个整数值,所以我想一个用于散列的数组就足够了。我很难概念化如何构造一个哈希函数,这样给定的键就可以给数组一个索引。

任何帮助都会很受欢迎。

哈希的最大条目数为: 4081*15 + 4081*14 + ... 4081 = 4081((15*(16))/2) = 489720。

举个例子:

代码语言:javascript
复制
int table[489720];

int lookup(unsigned char *key)
{
    int index = hash(key);
    return table[index];
}

哈希函数有哪些好的选择,或者我该如何去构建一个?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-02-22 16:03:23

为了散列C字符串,我一直使用这个函数(取你的散列表大小的结果):

代码语言:javascript
复制
int hashstring(const char* s) {
  int key = 0;
  while (*s) {
    key = key*37 + *s++;
  }
  return key;
}

我不记得最初是从哪里得到它的,但多年来它从未让我失望过。

票数 3
EN

Stack Overflow用户

发布于 2010-06-03 07:43:08

您的密钥空间很大(大约2^(8*15)),所以如果您想要一个完美的散列,您需要知道预先显示的489720个实际密钥。即使这样,实际上也不可能为这些键找到一个完美的散列,即使您允许使用更大的表(也称为非常低的负载率)。据我所知,找到完美散列的唯一方法是反复试验,除非你的表有接近489720^2个条目,否则随机散列很可能会失败。

我强烈建议使用regular (non-perfect) hashdeal with collisions appropriately,例如使用链接:

代码语言:javascript
复制
struct entry {
  unsigned char *key;
  int value;
  struct entry *next;
} *table[1<<20];
int lookup(unsigned char *key) {
  int index = hash(key) % (1<<20);
  for (struct entry *e = table[index]; e != NULL; e = e->next) {
    if (!strcmp(key, e->key)) return e->value;
  }
  // not found
}

我也建议你不要自己实现它--使用像c++ hashmap这样的标准库。

票数 2
EN

Stack Overflow用户

发布于 2010-06-03 07:02:50

如果你想要一个完美的散列,那么你可以从阅读perfect hashing上的维基百科文章开始。如果你遇到困难,你可以在这里寻求帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2962207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档