我的问题是为什么以下代码可以正常工作
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&)'|
答案 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::string
到const 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;