2013-11-13 1 views
4

Я использую boost::unordered_map с пользовательской структурой, более или менее вектор целых чисел и есть пользовательский хэш-функция, которая выглядит следующим образом:становится слишком много столкновений с hash_combine

std::size_t seed = 0; 

for (int i = 0; i < myvec.size(); ++i) 
    boost::hash_combine(seed, myvec[i]); 

return seed; 

Когда myvec имеет размера 3 и я заполняю хэш с 1M элементами 1: 100 x 1: 100 x 1: 100 (поэтому каждый элемент myvec является целым числом от 1 до 100). Я получаю около 330 000 столкновений.

Нормально ли это иметь много столкновений и что я могу сделать, чтобы этого избежать?

+0

Под «столкновениями», я полагаю, вы имеете в виду, что они имеют значение «size_t»? –

+0

@DavidSchwartz Я так думаю, но более конкретно - я подсчитываю ведра, которые имеют более 1 элемента в окончательном 'unordered_map' – eddi

ответ

3

Вы правы. Функция Boost's hash_combine не подходит для этого набора данных. Вы можете проверить с помощью this code, который показывает почти 600 000 столкновений за миллион тестовых записей.

Вот простое исправление:

for (int i = 0; i < myvec.size(); ++i) 
    boost::hash_combine(seed, myvec[i] * 2654435761); 

Магическое число является простым близко к 2^32 * (SQRT (5) -1)/2 - см Knuth для объяснения того, почему это работает в развернуть интервалы.

+0

спасибо - эта модификация уменьшила количество столкновений, но еще более 200000 кодеров имеют более 1 элемента; и еще один вопрос - не повлияет ли это на производительность, поскольку теперь ей приходится делать несколько умножений каждый раз? – eddi

+0

Ведра, имеющие более одного элемента, совершенно нормальные, это часть того, как работает неупорядоченная карта. Что касается влияния производительности как «значительного», я полагаю, это будет зависеть от вашего приложения, но, вероятно, нет. Если это имеет значение, сравните несколько разных хеш-функций и выберите тот, который лучше всего работает в вашем конкретном приложении, - если возможно, используйте живые данные. –

Смежные вопросы