我正在使用boost::hash
来获取字符串的哈希值。
但它在Windows 32位和Debian 64位系统上为相同的字符串提供了不同的哈希值。
那么无论平台如何,我如何使用boost::hash
获得相同的哈希值(32位或64位)?
答案 0 :(得分:4)
boost::hash
的保证是什么?我没有看到任何
保证生成的哈希码可以在。之外使用
产生它的过程。 (经常出现这种情况
哈希函数。)如果需要外部数据的哈希值,
适用于不同的程序和不同的平台(例如
对磁盘上的数据进行哈希访问),然后你必须编写你的
拥有。类似的东西:
uint32_t
hash( std::string const& key )
{
uint32_t results = 12345;
for ( auto current = key.begin(); current != key.end(); ++ current ) {
results = 127 * results + static_cast<unsigned char>( *current );
}
return results;
}
只要您不必担心,应该做到这一点
移植到一些异国情调的大型机(可能不支持
uint32_t
)。
答案 1 :(得分:0)
使用一些众所周知的通用散列函数,例如SHA,因为它们应该保证相同的字符串在任何地方都具有相同的散列。请注意,如果您正在执行与安全相关的操作,则SHA可能太快。这是一个奇怪的事情,但有时快并不意味着好,因为它开启了暴力攻击的可能性 - 在这种情况下,还有其他较慢的哈希函数,其中一些基本上连续多次重新应用SHA 。另一件事,如果你是哈希密码,记得加盐(我不会详细介绍,但信息可以在网上轻松访问)。
答案 2 :(得分:0)
上面的哈希函数很简单,但很脆弱。
例如,传递给那个函数字符串,如“bb”“bbbb”“bbddbb”“ddffbb” - 对符号甚至ASCII码的任意组合,并注意低字节。 它总是57岁。
相反,我建议使用相对轻量级的哈希函数 并且没有容易的漏洞:
#define NLF(h, c) (rand[(uint8_t)(c ^ h)])
uint32_t rand[0x100] = { 256 random non-equal values };
uint32_t oleg_h(const char *key) {
uint32_t h = 0x1F351F35;
char c;
while(c = *key++)
h = ((h >> 11) | (h << (32 - 11))) + NLF(h, c);
h ^= h >> 16;
return h ^ (h >> 8);
}