为什么hash <const char * =“”>适用于字符串但不适用于字符串变量?

时间:2017-03-02 04:21:21

标签: c++ hash

我的问题是为什么以下代码可以正常工作

hash<const char*> PassHash;

cout << PassHash("Hello World");

但是这段代码不会编译。

hash<const char*> PassHash;
string password;
password = "Hello World";

cout << PassHash(password);

在代码块中我收到此错误

error: no match for call to '(__gnu_cxx::hash<const char*>) (std::string&)'|

2 个答案:

答案 0 :(得分:3)

std::hash的定义与以下内容类似

template<typename T>
struct hash {
  size_t operator()(const T& value) const {
    ...
  }
}

std::hash<const char*>模板实例化定义接受operator()的{​​{1}},但您传递的const char*是另一种类型,这是微不足道的。

只需直接使用std::string作为密码变量,而使用std::string代替。

答案 1 :(得分:1)

没有从std::stringconst char*的隐式转换,这是您的示例工作所必需的。

您可以致电string::c_str()明确执行此“转化”...

hash<const char*> PassHash;
string password;
password = "Hello World";

cout << PassHash(password.c_str());

...但这只会计算字符串指针的哈希,因为hash<const char*>没有专门化!所以这只匹配通用指针特化hash<T*>

你真正想要的是对字符串的整个字符数组的哈希值,所以如果字符串的一个字符发生变化,你(很可能)会获得不同的哈希值。

为此,您可以使用hash<std::string>专业化。这适用于const char*std::string个参数,因为std :: string有一个转换构造函数,它带有const char*

示例:

const char* password1 = "Hello World";
string password2 = "Hello World";

hash<const char*> charPtrHasher;

// This only calculates a hash from the value of the pointer, not from 
// the actual string data! This is why you get a different hash for each.
cout << "Test 1:\n";
cout << charPtrHasher(password1) << endl << charPtrHasher(password2.c_str()) << endl;

hash<std::string> stringHasher;

// This correctly calculates the hash over all characters of the string!
cout << "\nTest 2:\n";
cout << stringHasher(password1) << endl << stringHasher(password2) << endl;

现场演示:http://coliru.stacked-crooked.com/a/047c099f5dcff948