作为研究项目的一部分,我正在测试我在Eternally Confuzzled here上找到的一些哈希函数。该项目与页面缓存算法有关,哈希行为本身从未像现在这样重要,但这仍然是我自己的好奇心。为了测试,我使用以下代码:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
unsigned oat_hash(void *key, int len);
int main()
{
string name;
cout << "Enter a name: ";
getline(cin, name);
cout << "Hash: " << oat_hash(&name, sizeof(string)) << endl << endl;
cout << "Enter the name again: ";
getline(cin, name);
cout << "Hash: " << oat_hash(&name, sizeof(string)) << endl << endl;
return 0;
}
unsigned oat_hash(void *key, int len)
{
unsigned char *p = (unsigned char*) key;
unsigned h = 0;
for (int i = 0; i < len; i++) {
h += p[i];
h += (h << 10);
h ^= (h >> 6);
}
h += (h << 3);
h ^= (h >> 11);
h += (h << 15);
return h;
}
程序执行1输出:
Enter a name: John Doe
Hash: 4120494494
Enter the name again: John Doe
Hash: 4120494494
程序执行2输出:
Enter a name: John Doe
Hash: 3085275063
Enter the name again: John Doe
Hash: 3085275063
我输入了相同的字符串并在同一程序执行期间获得了相同的哈希值,但为什么不同程序执行的值会有所不同?不同的哈希值是否表示不同的数据?
答案 0 :(得分:2)
std::string
的实现包含指针。您正在对std::string
的内部进行哈希处理,而不是std::string
的实际文本。在现代系统中,堆栈位置是随机的,freestore分配也是随机的,每次运行时都会产生std::string
的不同内部。
你可能想要改变这样的代码:
unsigned oat_hash(void const *key, int len)
{
unsigned char const *p = static_cast<unsigned char const *>(key);
// etc.
}
//...
cout << "Hash: " << oat_hash(name.c_str(), name.size()) << endl << endl;