Algorithm 为自定义结构生成唯一哈希?

Algorithm 为自定义结构生成唯一哈希?,algorithm,hash,hashmap,Algorithm,Hash,Hashmap,我需要为封装此数据的对象构建散列(作为无符号32位整数) Entry { uint8 r; uint8 g; uint8 b; bool empty; uint8 count; } 哈希对于每个实例都必须是唯一的,除非实例相等。当且仅当满足以下条件时,两个实例相等: 计数在两种情况下都相等 和 r、 g、b等于或在这两种情况下都设置为空 哈希将用于哈希映射和其他容器中,因此可能会经常调用它。哈希生成需要快速 我想到了CCCERRGGGBBB,其中

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

Entry {
    uint8 r;
    uint8 g;
    uint8 b;
    bool empty;
    uint8 count;
}
哈希对于每个实例都必须是唯一的,除非实例相等。当且仅当满足以下条件时,两个实例相等:

  • 计数在两种情况下都相等

  • r、 g、b等于在这两种情况下都设置为空
哈希将用于哈希映射和其他容器中,因此可能会经常调用它。哈希生成需要快速

我想到了CCCERRGGGBBB,其中:

  • CCC/RRR/GGG/BBB:3位数字上的计数/r/g/b
  • E:如果设置为空,则为1,否则为0
但这个数字远远超出了范围


有什么想法吗?

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

if (empty == false)
  return count ~ r ~ g ~ b
else
  return count ~ 0
得到一个重叠,即当empty为false且r,g,b均为0时-这将是与empty为true且r,g,b均为0时相同的哈希


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

请注意:大多数哈希不能保证绝对唯一性,但其唯一性足以使验证精确匹配的额外时间可以忽略不计,因为它基本上是O(1)。很难或不可能保证每个实例的哈希都是唯一的,特别是当实例的大小大于散列的大小时,例如在您的情况下:您试图将每个33位的值拟合到一个唯一的32位变量中。在您的情况下,唯一性在数学上是不可能的(因为在32位uint中有比可能的数字更多的不同输入值)“唯一散列”是一个矛盾修饰法。你唯一能做的就是创建一个“散列”,它是对象中所有位的串联,即33位。这里有一个想法:由于蓝色值通常使用的范围小于红色或绿色(例如,8位将3位分配给红色和绿色,2位分配给蓝色——不确定在你的情况下是否如此),你可以采用
b/2
,它可以存储在7位中。然后左移,把它们加在一起,得到32位。非常优雅。另一个想法是删除计数的最高位,并用bool替换它。那么重叠部分只会出现在
count>127
count伟大答案之间!我觉得有点愚蠢,我没有意识到我的33位数据不能放入32位。。。计数重叠对我来说是最好的选择,计数永远不会超过100。可能还不到50岁。谢谢