gpt4 book ai didi

c++ - boost::hash/std::tr1::hash 不为复制的 const char* 返回相同的哈希值

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:54 25 4
gpt4 key购买 nike

我有以下代码:

#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 不同——事实上,我每次运行程序时它都会返回不同的哈希值。

谁能解释一下为什么?

最佳答案

正如 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 它正在对 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

关于c++ - boost::hash/std::tr1::hash 不为复制的 const char* 返回相同的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11274583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com