Недавно мне было любопытно, как работали алгоритмы хеширования для плавающих точек, поэтому я посмотрел исходный код для boost::hash_value
. Оказывается довольно сложно. Фактическая реализация пеет по каждой цифре в радиусе и накапливает хеш-значение. По сравнению с целыми хеш-функциями, это гораздо более активное участие.
Мой вопрос: почему алгоритм хеширования с плавающей запятой будет более сложным? Почему не просто хэш-представление двоичного представления значения с плавающей запятой, как если бы оно было целым?
Как
std::size_t hash_value(float f)
{
return hash_value(*(reinterpret_cast<int*>(&f)));
}
Я понимаю, что float
не гарантированно будет такого же размера, как int
для всех систем, но такого рода вещи можно было бы обработать несколькими мета-программами шаблонов, чтобы вывести интегральный тип с одинаковым размером как float
. Итак, каково преимущество введения совершенно другой хеш-функции, которая специфически работает с типами с плавающей запятой?