2

私は次のコードを持っています:

#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は異なります。実際、プログラムを実行するたびに異なるハッシュが返されます。

誰かが理由を説明できますか?

4

2 に答える 2

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

必要な唯一の変更は、boost が a をハッシュしていることを伝えることであり、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
于 2012-06-30T13:59:11.250 に答える