Отправка строк и векторов C в MurmurHash дает противоречивые результаты - PullRequest
2 голосов
/ 21 октября 2010

Я пытаюсь использовать MurmurHash (возвращая 64-битные хэши на 64-битном комопьютере) и отправил ему простую трехбуквенную строку 'yes' следующим образом

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

(где 3 - длина, а 10 - семя) Это дает 64-битный хэшированный ответ, как и ожидалось, я могу установить больше указателей на строки C, держащие yes, и все они возвращают одно и то же хэшированное значение.

Но если я попытаюсь отправить ей строку C ++:

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

... Я получаю другой результат для метода строки C, более того, если я настрою несколько таких строк одинаково, все они дают разные результаты. Это наводит меня на мысль, что строки, возможно, не хранятся в смежных местах памяти, некоторые из Google это подтвердили. Поэтому я попытался установить вектор в динамической памяти, так как это был единственный способ заставить непрерывную память. Точно так же, как строковый метод 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]);

Насколько я понимаю, мой вектор символов будет начинаться с адреса, заданного вектором, и заполнять последовательные байты моими тремя символами точно так же, как строка C. Я смущен, почему я получаю разные результаты, любая помощь оценена? Спасибо C

Ответы [ 2 ]

4 голосов
/ 21 октября 2010

&mystring указывает на строковый объект.Вы хотите использовать mystring.c_str() для получения указателя на массив необработанных символов.

Для вектора вам нужно &(*charvec)[0].Но вы, вероятно, не хотите использовать new;Вы могли бы просто сделать vector<char> charvec; void *myvecptr3 = &charvec[0];.

2 голосов
/ 21 октября 2010

Причина в том, что std::string сам хранит указатель на массив char.Попробуйте

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

И вам действительно не нужно будет работать с вектором символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...