2011-05-16 78 views
3

我想生成一个url的唯一哈希键。使用 ATM IM升压哈希生成url的唯一哈希键

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 

是否有人有一个简单的方法吗?

+0

“主机”,“路径”和其他类型有哪些? – Mat

回答

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* s,而你打算重用这些指针,那么你得到的结果令SENS。对于char*hash_value没有超载。因此唯一会进入计算的是指针值本身(具体如何定义)。 (见hash reference的最底部。)

其他点:这个9223372036854775807值是比较特殊的。它的十六进制表示为:

0x7fffffffffffffff 

所以你可能有一个转换/溢出问题的地方,是不是在你贴什么可见。

+0

嗯问题是我经常得到9223372036854775807我把原始密钥放在由bigint(20)定义的mysql数据库中。 ?? – Roby

+0

你能给出一些生成这个散列的输入的具体例子吗?此外,如前所述,你正在哈希变量的类型。 (最好将是一个简单的例子,沿着什么垫给出的线) –

+0

嘿,问题是与bigint ..现在即时通讯使用unsigned bigint及其工作!谢谢 – Roby

0

与实现的一些功能MD5尝试对于C