【问题标题】:Generating a unique hash for a custom structure?为自定义结构生成唯一哈希?
【发布时间】:2013-05-31 17:25:10
【问题描述】:

我需要为封装此数据的对象构建散列(作为无符号 32 位整数)。

Entry {
    uint8 r;
    uint8 g;
    uint8 b;
    bool empty;
    uint8 count;
}

每个实例的哈希值必须是唯一的,除非实例相等。两个实例相等当且仅当:

  • 两个实例的计数相等

  • r,g,b 相等OR在两个实例中都设置为空

哈希将在哈希映射和其他容器中使用,因此可能会被非常频繁地调用。哈希生成需要很快。

我想到了 CCCERRRGGGBBB,其中:

  • CCC/RRR/GGG/BBB:3 位计数/r/g/b
  • E:如果设置为空则为 1,否则为 0

但这个数字超出了范围。

有什么想法吗?

【问题讨论】:

  • 请注意:大多数哈希值不保证绝对唯一性,但足够独特以至于验证完全匹配的额外时间可以忽略不计,因为它基本上是 O(1)。
  • 很难或不可能保证每个实例的哈希都是唯一的,特别是当实例的大小大于哈希的大小时,如您的情况:您正在尝试适应每个 33 位值转换为一个唯一的 32 位变量。
  • 在您的情况下,唯一性在数学上是不可能的(因为在 32 位 uint 中,不同的条目值比可能的数字更多)
  • “唯一哈希”是矛盾的。您唯一能做的就是创建一个“哈希”,它是对象中所有位的串联,即 33 位。
  • 这是一个想法:因为通常蓝色值使用比红色或绿色更小的范围(例如,8 位将 3 位分配给红色和绿色,将 2 位分配给蓝色 - 不确定这在你的情况)你可以拿b/2,它可以存储为7位。然后左移并将它们全部相加为 32 位。

标签: algorithm hash hashmap


【解决方案1】:

您将很难将 33 位信息编码为 32 位

if (empty == false)
  return count ~ r ~ g ~ b
else
  return count ~ 0

你得到一个重叠,即当空为假且 r,g,b 均为 0 时 - 这将与空为真且 r,g,b 为 0 时的哈希值相同

如果没有进一步的假设,这是可以做到的最好的。

【讨论】:

  • 非常优雅。另一个想法是只删除最高位的计数,并将其替换为布尔值。那么重叠只会在count > 127count <= 127之间。
  • 很好的答案!我觉得有点愚蠢,我没有意识到我的 33 位数据不能放在 32 位中......计数重叠是我的最佳选择,计数永远不会超过 100。它可能甚至不会超过 50 岁。谢谢!
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2013-07-29
  • 2017-04-09
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多