【问题标题】:How to hash fixed size string plus one integer如何散列固定大小的字符串加一个整数
【发布时间】:2013-10-01 20:26:47
【问题描述】:

我有一个简单的结构,由一个固定大小的字符串和一个整数组成。我需要使用这个结构作为哈希表的键。我有一个用于 sting 的哈希函数 Hs(string) 和一个用于整数的哈希函数 Hi(int),我想知道这个简单结构的哈希函数是否只是 H(struct) = Hs(string) +嗨(整数)?或者,我可以将整数编码为字符串并将其附加到字符串中,然后只使用字符串哈希函数。有什么建议? 谢谢。

【问题讨论】:

  • 什么编程语言?
  • c,c++。但如果答案是针对特定语言的,我会感到惊讶。
  • 一些编程语言为从内置(例如:C#)派生的类/结构的散列提供运行时支持

标签: hash hashtable hash-function


【解决方案1】:

为了弄清楚“如何”,我们需要先回答几个问题:
a) 您应该能够容纳多少物品?
b) 哈希表的大小是多少?
c) 有多少<string X int> 的组合(因为字符串的大小固定,所以很容易计算)?

一旦你弄清楚了 - 就会更容易找到一个可以最小化冲突的散列函数,例如,在某些情况下使用 Hs(string) 就足够了!

【讨论】:

  • 字符串部分类似于uuid,均匀分布,整数类似于自早期开始时间以来经过的秒数。我想说表中的条目数可能达到几百万甚至更多。
  • 根据我的阅读,75% 的加载因子被认为是好的。如果 UUID 提供了良好的分布,那么我认为在散列算法中使用 int 没有任何优势。
  • 存在uuid相同但整数值不同的条目。
  • @atsu 对,您可以用它来识别bucket<string X int> 在哪个<string X int> 中(发生碰撞时)。
【解决方案2】:

其中任何一个都可以。我的默认值是 Hs(string) XOR Hs(int) 但 plus 也可以。它只需要可能不会发生碰撞,尽管 Hs(string) XOR Hs(int) 或 Hs(string) + Hs(int) 会更快,但两者都可能不会发生碰撞。

【讨论】:

  • int = 32 字节(至少在 Java 中是这样)而 String (理论上)仅受 JVM 限制 - 你如何异或两个不同大小的项目?
  • 你先对它们进行哈希处理。您现在有了正确长度的固定大小。
  • @FrankieRobertson 在不了解平台/哈希实现的一些细节的情况下,您可能会通过简单地异或这两个值来引入很多偏差(冲突)。
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 2011-10-06
  • 2022-01-16
  • 1970-01-01
  • 2013-11-16
  • 2016-10-05
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多