Здравствуйте, watch-maker, Вы писали:
WM>Здравствуйте, pepsicoca, Вы писали:
P>>Пока что сделал что-то вроде этого:
WM>Есть проблемы с pointer aliasing.
What is "pointer aliasing"?
WM>Плюс хэш-функции вида "суммируем байт" дают обычно очень плохие распределения.
P>>Посоветуйте, какую хэш-функцию лучше взять, чтобы было быстро и переносимо. WM>Кастуй указатель к uintptr_t, и возвращай это значение.
Кстати это мысль. В типичном случае платформы х86 при выделении памяти в куче указатели отличаются в младших разрядах.
WM>Если тебе известно, что от хэш-функции чаще используются младшие биты, то можно сдвинуть (циклически или даже просто так) результат вправо на число бит, равное логарифму типичного выравнивания при выделении памяти (скорее всего будет равно чему-то вроде 2-х или 3-х бит).
Зачем вправо?
Вправо сдвинуть значит потерять различия в близкорасположеных указателях. Как раз тогда и будет плохое распределение, все хеш-значения будут одинаковыми.
Может влево?
WM>Ну или можно дальше вокруг значения типа uintptr_t сделать этап обычного целочисленного хэширования. Хотя для указателей это скорее лишнее.