【问题标题】:Hashing implementation on a list of size 1K in CC中大小为1K的列表上的散列实现
【发布时间】:2013-06-20 20:10:54
【问题描述】:

我是 C 新手,我有一个需求,我需要根据“e-mail id OR ipv4/6-address”进行快速查找

我的结构应该是这样的

{
  enum_usr_type ;/*(which can be either e-mail type or ip-address type)*/

  char_id_data ; /*(which can be either a email-id string OR ipv4/6 ip-address string) */
}

整个数据库的大小预计为1K。

任何人都可以建议我应该如何去做(也许是 hash table ,但我不熟悉)。

【问题讨论】:

  • 通过连续数组线性搜索。
  • 是的,在这种情况下,哈希表是一个很好的解决方案。您有什么具体要求/问题吗?
  • @KerrekSB 实际上,1000 个条目并不是很多数据。
  • 1K?甚至不要开始考虑“快速”,而要“简单”。这是不值得的。
  • 如果类型是IP地址,还是字符串吗?就像"192.168.1.2" 这样的字符序列,而不是像192, 168, 1, 2 这样的四个字节?如果是这样,请忽略差异并使用任何字符串散列函数。

标签: c string hash hashmap hashtable


【解决方案1】:

POSIX 哈希表管理

man hsearch

Libhash

ftp://ftp.ugh.net.au/pub/unix/libhash/

Libhash 是一个用 C 编写的小型哈希库

安装后

man libhash

我个人更喜欢 libhash,它很小,你可以很容易地嵌入到你的代码中,而且它也很容易使用:

hash h;

/* in your case number_of_buckets = 2053, 1k*2 = 2048, the next prime number is 2053. */
hash_initialise(&h, 2053U, NULL, NULL, NULL, free, free)

/* insert */
hash_insert(&h, key, value);

/* retrieve */
hash_retrieve(&h, key, &ptr);

/* dispose hash table */
hash_deinitialise(&h);

再次

man libhash

【讨论】:

  • 我环顾四周,在某些地方推荐 DJB2 算法用于字符串哈希...你能告诉我如何计算 DJB2 的桶大小
  • @HimanshuGupta 这取决于您使用的散列函数的性质,例如,如果它是质数的桶,有些表现更好,对于其他人来说可能没那么重要,在这种情况下使用 libhash如果是素数就更好了。在您的情况下,JB2 它只是散列函数(如果我错了,请有人纠正我)您仍然需要处理冲突以及更多内容才能最终得到您正在寻找的东西。正如 n.m 所说,1Kb 的数据不要开始考虑快速,要简单。
  • @HimanshuGupta 如果你想实现自己的哈希表,不要这样做,你会重新发明轮子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2019-03-31
  • 2011-05-08
  • 2020-05-05
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多