我想生成网址的唯一哈希密钥。 atm我正在使用boost hash
std::size_t seed = 0;
boost::hash_combine(seed, host);
boost::hash_combine(seed, path);
boost::hash_combine(seed, query);
boost::hash_combine(seed, fragment);
但是哈希键经常重复...... :(
http://www.finanzen.de/geldanlage-boerse.html 9223372036854775807
http://www.finanzen.de/geldanlage-china.html 9223372036854775807
有人有SIMPLE替代方案吗?
答案 0 :(得分:4)
我认为该代码中没有错误。这个虚拟示例的哈希值不同:
#include <boost/functional/hash.hpp>
#include <cstdio>
int main()
{
size_t seed = 0;
std::string s1("www.finanzen.de");
std::string s2("geldanlage-boerse.html");
std::string s3("geldanlage-china.html");
boost::hash_combine(seed, s1);
boost::hash_combine(seed, s2);
fprintf(stdout, "%016lx\n", seed);
seed = 0;
boost::hash_combine(seed, s1);
boost::hash_combine(seed, s3);
fprintf(stdout, "%016lx\n", seed);
return 0;
}
现在,如果您的host
,path
等等char*
,并且您正在重复使用这些指针,那么您获得的结果就会变得很明显。 hash_value
char*
没有超载9223372036854775807
。所以进入计算的唯一事情就是指针值本身(具体是如何定义)。 (请参阅hash reference的最底部。)
其他观点:此0x7fffffffffffffff
值非常特殊。它的十六进制表示为:
{{1}}
所以你可能在你发布的内容中看不到转换/溢出问题。
答案 1 :(得分:0)
尝试使用为C
实现的一些md5函数