【发布时间】: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 位。