2010-10-21 8 views
2

J'essaie d'utiliser MurmurHash (retour 64 hash bits sur un comoputer 64bit) et ont envoyé la simple chaîne 3 lettres « oui » comme suitEnvoi des chaînes C et vecteurs MurmurHash donne des résultats incohérents

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

(où 3 est la longueur et 10 est la graine) Cela donne une réponse hachée 64 bits comme prévu, je peux mettre en place plus de pointeurs sur les chaînes C en maintenant oui et ils retournent tous la même valeur hachée.

Mais si je tente d'envoyer un C++ chaîne:

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

... J'obtenir un résultat différent de la méthode de chaîne C, ce qui est plus si je mis en place plusieurs de ces chaînes de la même manière , ils donnent tous des résultats différents. Cela me suggère que les chaînes ne sont peut-être pas stockées dans des emplacements de mémoire contigus, certains Googling ont soutenu cela. J'ai alors essayé de mettre en place un vecteur en mémoire dynamique car c'était la seule façon de penser à forcer la mémoire contiguë. Tout comme la méthode de chaîne C++, elle renvoyait un résultat différent de la méthode de chaîne C et lorsque j'en ai défini plusieurs, ils renvoyaient tous un résultat différent l'un de l'autre. Je les ai mis en place comme suit:

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]); 

Si je comprends bien mon vecteur char commencera à l'adresse du vecteur est donné et de remplir octets consécutifs avec mes trois personnages de la même manière comme une chaîne C. Je suis confus pourquoi je reçois des résultats différents, toute aide appréciée? Merci C

+2

Cela ressemble beaucoup à un [bon livre C++ d'introduction] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – sbi

Répondre

4

&mystring points à l'objet chaîne. Vous voulez utiliser mystring.c_str() pour obtenir un pointeur vers un tableau de caractères bruts.

Pour le vecteur, vous voulez &(*charvec)[0]. Mais vous ne voulez probablement pas utiliser new; vous pouvez simplement faire vector<char> charvec; void *myvecptr3 = &charvec[0];.

+0

Les deux ont travaillé, merci. Pouvez-vous nous dire pourquoi & charvec est une adresse différente de & charvec [0], je m'attendais à ce qu'ils soient les mêmes. Merci encore. – Columbo

+0

points & charvec' à l'objet vectoriel lui-même, qui contient tous ses rouages ​​internes. 'charvec [0]' utilise la surcharge de l'opérateur pour accéder au premier élément du stockage appartenant au vecteur. Donc '& charvec [0]' prend son adresse. La norme garantit que le stockage appartenant à un vecteur sera toujours contigu en mémoire. –

+0

Merci beaucoup. – Columbo

2

La raison est que std::string lui-même stocke un pointeur sur le tableau char. Essayez

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

Et vous n'auriez pas besoin de travailler avec le vecteur char en effet.

Questions connexes