Hash 保留哈希值

Hash 保留哈希值,hash,hashcode,Hash,Hashcode,我需要使用一个现有的(C++)散列函数,它为给定的键创建32位散列值。 功能极其复杂 现在我需要保留一个值,即哈希函数永远不会输出这个值 在不理解/更改现有哈希函数的复杂逻辑的情况下,是否有一种安全的方法 非常感谢…看起来您需要“可选”键。然后你会这么做 hash = hash_combine(has_value()? 1 : 0, has_value()? hash(value()) : 0); 或者,如果您坚持,您可以将位数减少到31 compromised_hash = SHIFT_RI

我需要使用一个现有的(C++)散列函数,它为给定的键创建32位散列值。 功能极其复杂

现在我需要保留一个值,即哈希函数永远不会输出这个值

在不理解/更改现有哈希函数的复杂逻辑的情况下,是否有一种安全的方法


非常感谢…

看起来您需要“可选”键。然后你会这么做

hash = hash_combine(has_value()? 1 : 0, has_value()? hash(value()) : 0);
或者,如果您坚持,您可以将位数减少到31

compromised_hash = SHIFT_RIGHT(raw_hash) ^ raw_hash; // just an example.

现在,MSB将始终为空。如果不是:你有你的特殊标记。要做到这一点并不容易,因为它只能将哈希域减少1个元素(除非您可以更改哈希原始函数)

如果您想要一个永远不会返回零的哈希函数,最简单的方法是:

int result;

hash = compute_hash_one_way();  // Hopefully it's not zero
if (hash) return hash;          // In which case we return it
hash = compute_hash_another_way(); // Try something else
if (hash) return hash;             // If that was good, return that
return 8675309; // We know THAT's not zero
第二个散列计算不需要任何花哨的东西;基本上,如果一个人有任何非零值可供使用,而这有点依赖于输入,那么他也可以优先使用它而不是返回一个常量,但最好使用一个真正糟糕的快速散列函数(或者如果原始值返回零,甚至只是始终返回一个常量)而不是花太多时间计算第二个散列,以至于外部代码可能会推断原始散列为零。请注意,如果原始散列是好的,即使在原始散列返回零时返回一个常量,也只会导致20亿分之一的输入返回该常量,而不是40亿分之一的输入返回该常量


[顺便说一句,如果我在.NET/Java中编写了GetHashCode或hashcode的规范,我会强烈建议一个好的哈希函数只有在本质上可以立即返回零的情况下才应该返回零。例如,拥有
Integer.GetHashCode()所需的额外时间
从不返回零在大多数情况下都会超过对值0进行冗余调用可能花费的任何时间,但在某些情况下,返回零的字符串散列可能会对性能产生重大影响。]

谢谢,切换到31位是个好主意,但是第一个可选键的解决方案我并不真正理解。_value()和value()的作用是什么?因为您没有标记为任何特定语言,所以它是“可选”类型的伪代码(我假设您可能希望将“无值”表示为散列0,但事实上,任何“特殊”情况都可以以相同的方式处理)。C++有“代码> Boo:”:可选的< /C> >,C >代码> >系统。等。IOW:“特殊情况检测”的一个例子