2011-04-15 82 views
1
size_t hash(const std::string data) { 
    size_t h(0); 
    for (int i=0; i<data.length(); i++){ 
     h = (h << (31-i)^(h >> i)^data[i]); 
    } 
    h = h%hashsize; 
    return h; 
} 
+0

嗯,我会说它有一个错误。看到“31”和size_t一起使用意味着它可能不会混合它想要混合的方式。 – ohmantics 2011-04-15 05:55:43

+0

这将需要大量的铅笔和纸张工作。函数调用的上下文是什么? – pjwilliams 2011-04-15 05:57:29

+0

我发现这在网络的某个地方,并且不理解这个h =(h <<(31-i)^(h >> i)^ data [i]); ' – Vijay 2011-04-15 05:58:52

回答

3

这对std::string的哈希函数,表面上是适合TR1和C++ 11的std::unordered_map<>std::unordered_set<>等即,它试图在给定std::string用于创建作为唯一-AS-可能size_t值散列表。

这就是说,这是一个糟糕的散列函数。与unordered_map<>,unordered_set<>等一起提供的任何标准库实现都会为标准库字符串提供内置哈希函数,这些函数的实现比这个更好。

编辑:(响应于评论)<<是按位左移,>>是逐位右移,并^是按位异或,所有这些在此Wikipedia条目简要讨论:Bitwise operation

+0

所以..你的意思是说它会为该字符串创建唯一的无符号整数!我是对吗? – Vijay 2011-04-15 06:07:17

+1

@ zombie:不是唯一的,而是尽可能唯一 - 只有32/64位存储空间(在大多数平台上),可能存在太多可能的字符串值,以便为每个字符串生成真正唯一的整数。但是,是的,这是主意。 – ildjarn 2011-04-15 06:10:11

相关问题