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