Простое приведение к int или memcpy(&doubleValue, &intValue, sizeof(double)) не подходит, потому что получается адское количество коллизий, особенно когда на вход поступают близкие значения double.
Какая хэш-функция окажется более эффективной?
Зависит от распределения входящих данных. Если эти вещественные числа распределены равномерно по всему полю double, то хеширование не имеет кажется никакого смысла. А вот если, тривиальный пример, входные данные все >14 и <15 то можно просто брать дробную часть...
Согласно условию задачи, хэш должен быть uint32_t. А как это - xor младших и старших бит? То есть нужно в uint64_t выделить 32 младших бита, 32 старших и сделать их xor?
Artyom_Kopan, Почти. Домножать надо ужe uint. Тогда домножение на большое простое (или хотя бы нечетное) число в 64 бита и арифметика uint64_t по модулю 2^64 вносит элемент случайности.
И еще у вас у memcpy перепутан порядок аргументов.
Вместо сдвигов туда и обратно для младших битов можно использовать операцию побитового и с 0xFFFFFFFF или просто привести к int32_t - что отбросит лишние биты.
Или, можно вообще сразу написать return static_cast<uint32_t>((temp >> 32)^temp);. В младших битах как раз что вам надо получится и старшие выкинутся.
И старший/младший не переводится так на прямо на английский. Для этого там есть термины high/low.