Дает ли хеш-функция <char *> в STL отображение 1-1 между char * и size_t? - PullRequest
0 голосов
/ 30 ноября 2009

у меня есть пара Я знаю, что значение pair.first не может быть больше 1000. Я также знаю, что pair.second, строка, это всегда 1 слово. Никогда не более 1 слова.
Итак, чтобы построить значение Hash для пары, я делаю следующее:

pair<int,string> p;
hash<char*> H;
hash_vale = H(p.second)*1000 + p.first;

Я думаю, что это даст уникальные значения, пока хеш-значение строк не слишком велико и что H (p.second) даст 1-1 сопоставления. Являются ли эти предположения действительными?

Спасибо

1 Ответ

4 голосов
/ 30 ноября 2009

По определению, хэш не может быть один-к-одному из-за принципа голубя. То есть, есть 2 ^ 32 возможных значений хеша, но гораздо больше возможных строк. Таким образом, должно быть две строки с одинаковым значением хеш-функции.

Во-вторых, вы почти наверняка вызываете переполнение, умножая значение хеш-функции на 1000, поскольку хеш-код должен использовать все 32 бита. Вам гораздо лучше хешировать int, а затем смешивать хэши. Boost имеет функцию hash_combine: a + 0x9e3779b9 + (b << 6) + (b >> 2);

...