保留哈希值

时间:2013-03-15 14:12:48

标签: hash hashcode

我需要使用现有的(C ++)哈希函数,它为给定的密钥创建32位哈希值。 这个功能非常复杂。

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

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

非常感谢......

2 个答案:

答案 0 :(得分:0)

看起来你需要'可选'键。然后你做

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个元素(除非你可以改变哈希原始函数)

答案 1 :(得分:0)

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

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()永远不会返回零会超过在零值上冗余调用GetHashCode所花费的任何时间,但是在某些情况下,返回零的字符串哈希会产生重大的性能影响。 ]