Re[3]: посоветуйте хеш-функцию от указателя
От: pepsicoca  
Дата: 01.02.13 14:08
Оценка:
Здравствуйте, pepsicoca, Вы писали:

P>Здравствуйте, watch-maker, Вы писали:


WM>>Здравствуйте, pepsicoca, Вы писали:


P>>>Пока что сделал что-то вроде этого:


WM>>Есть проблемы с pointer aliasing.


P>What is "pointer aliasing"?


WM>>Плюс хэш-функции вида "суммируем байт" дают обычно очень плохие распределения.


P>>>Посоветуйте, какую хэш-функцию лучше взять, чтобы было быстро и переносимо.

WM>>Кастуй указатель к uintptr_t, и возвращай это значение.

P>Кстати это мысль. В типичном случае платформы х86 при выделении памяти в куче указатели отличаются в младших разрядах.


WM>>Если тебе известно, что от хэш-функции чаще используются младшие биты, то можно сдвинуть (циклически или даже просто так) результат вправо на число бит, равное логарифму типичного выравнивания при выделении памяти (скорее всего будет равно чему-то вроде 2-х или 3-х бит).


P>Зачем вправо?

P>Вправо сдвинуть значит потерять различия в близкорасположеных указателях. Как раз тогда и будет плохое распределение, все хеш-значения будут одинаковыми.
P>Может влево?

А, понял почему. При суммировании может и неважно, а при приведении к типу uintptr_t может помочь.
Но переносимо никак не узнать, какой шаг выравнивания на данной платформе.

WM>>Ну или можно дальше вокруг значения типа uintptr_t сделать этап обычного целочисленного хэширования. Хотя для указателей это скорее лишнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.