2

我正在尝试使用 MurmurHash(在 64 位计算机上返回 64 位哈希)并已将简单的 3 个字母字符串“是”发送如下

char* charptr = "yes";
cout << MurmurHash64A(charptr, 3, 10);

(其中 3 是长度,10 是种子)这给出了预期的 64 位散列响应,我可以设置更多指向 C 字符串的指针,它们都返回相同的散列值。

但是如果我尝试向它发送一个 C++ 字符串:

string mystring = "yes";
string* strptr = &mystring;
cout << MurmurHash64A(strptr, 3, 10);

...我得到了与 C 字符串方法不同的结果,更重要的是,如果我以相同的方式设置这些字符串中的几个,它们都会给出不同的结果。这向我表明,字符串可能没有存储在连续的内存位置,一些谷歌搜索支持了这一点。所以我然后尝试在动态内存中设置一个向量,因为这是我能想到的强制连续内存的唯一方法。就像 C++ 字符串方法一样,它返回与 C 字符串方法不同的结果,当我设置几个时,它们都返回彼此不同的结果。我将它们设置如下:

 char yes[3] = {'y', 'e', 's'};
 vector<char> *charvec = new vector<char>;
 void* myvecptr3 = &charvec;
 charvec->reserve(3);
 charvec->push_back(yes[0]);
 charvec->push_back(yes[1]);
 charvec->push_back(yes[2]);

据我了解,我的 char 向量将从给定向量的地址开始,并以与 C 字符串相同的方式用我的三个字符填充连续字节。我很困惑为什么我得到不同的结果,有什么帮助吗?谢谢 C

4

2 回答 2

4

&mystring指向字符串对象。您想用来mystring.c_str()获取指向原始字符数组的指针。

对于向量,您需要&(*charvec)[0]. 但是您可能不想使用new; 你可以这样做vector<char> charvec; void *myvecptr3 = &charvec[0];

于 2010-10-21T10:21:56.797 回答
2

原因是它std::string本身存储了一个指向char数组的指针。尝试

string mystring = "yes";
cout << MurmurHash64A(mystring.c_str(), 3, 10);

而且您确实不需要使用 char 向量。

于 2010-10-21T10:22:06.563 回答