2012-06-30 23 views
2

返回相同的哈希我有以下代码:的boost ::散/的std :: TR1 ::哈希不是复制为const char *

#include <cstring> 
#include <boost/functional/hash.hpp> 
#include <iostream> 

int main(int argc, char **argv) 
{ 
    const char *str1 = "teststring"; 

    // copy string 
    size_t len = strlen(str1); 
    char *str2 = new char[len+1]; 
    strcpy(str2, str1); 

    // hash strings 
    std::cout << "str1: " << str1 << "; " << boost::hash<const char*>()(str1) << std::endl; 
    std::cout << "str2: " << str2 << "; " << boost::hash<const char*>()(str2) << std::endl; 

    delete[] str2; 

    return 0; 
} 

我总是得到STR1相同的散列(如预期)。但是str2不同 - 事实上,每次运行程序时它都会返回一个不同的散列值。

有人可以解释为什么吗?

+3

谢谢你包括一个完整的例子。这很少见。 – robert

+2

它可能是哈希指针,而不是字符串的内容? – Linuxios

回答

5

正如Linuxios建议的那样,它是对指针值进行散列处理,而不是字符串。我用这段代码做了一个快速测试:

char str1[] = "teststring"; 
std::cout << "str1: " << str1 << "; " << boost::hash<const char*>()(str1) << std::endl; 
str1[3] = 'x'; 
std::cout << "str1: " << str1 << "; " << boost::hash<const char*>()(str1) << std::endl; 

这里是输出。请注意,字符串是不同的,但由于指针是相同的哈希匹配。

str1: teststring; 158326806782903 
str1: tesxstring; 158326806782903 

你需要做的唯一的变化是要告诉推动它的哈希一个std::string,它会给你匹配的哈希值。您的基础数据可以保持char*

std::cout << "str1: " << str1 << "; " << boost::hash<std::string>()(str1) << std::endl; 
std::cout << "str2: " << str2 << "; " << boost::hash<std::string>()(str2) << std::endl; 

结果:

str1: teststring; 10813257313199645213 
str2: teststring; 10813257313199645213 
+0

它的工作!但它是否散列*两个*字符串的指针?第一个是始终返回相同的散列。还是因为它是一个字符串文字? –

+0

@snøreven每次运行程序时,第一个字符串的地址都是固定的 - 它在可执行文件中。所以,它的散列总是一样的。另一个字符串来自'malloc()',并且每次都会根据系统其余部分的状态拥有不同的地址。 – robert

0

如果你真的想要的串的哈希不是指针,那么你可以使用boost::hash_range功能或自定义循环使用hash_combine,写自己的哈希函数对象。 boost::hash<std::basic_string<...> >使用hash_range进行散列,而has_range依次使用hash_combine

例如这样的事情:

struct CStringHash : public std::unary_function<char const*, std::size_t> { 
    std::size_t operator()(char const* v) const { 
     std::size_t seed = 0; 
     for (; *v; ++v) { 
      boost::hash_combine(seed, *v); 
     } 
     return seed; 
    } 
}; 
相关问题