生成唯一的URL哈希键

3

我希望能够生成一个URL的唯一哈希键。

目前我正在使用Boost哈希。

  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

有没有简单的替代方案?

hostpath和其他类型有哪些? - Mat
2个回答

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;
}

现在,如果您的hostpath等是char*类型,并且您正在重用这些指针,则您得到的结果是有意义的。没有char*hash_value重载。因此,将进入计算的唯一内容是指针值本身(如何完全未定义)。 (请参见哈希参考底部。)
另一点:此9223372036854775807值非常特殊。它的十六进制表示形式为:
0x7fffffffffffffff

所以你可能有一个转换/溢出问题,这个问题在你发布的内容中不可见。

问题在于我经常得到9223372036854775807,我将原始密钥放入了由bigint(20)定义的mysql数据库中。 - Roby
你能给出一些产生这个哈希值的具体输入示例吗?另外,正如之前提到的那样,你正在对哪些变量类型进行哈希处理。(最好是像Mat给出的简单示例。) - James Kanze
嘿,问题出在bigint上...现在我使用无符号的bigint,它可以工作了!谢谢。 - Roby

0

尝试使用一些实现了C语言的md5函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接