Хэширование значений с плавающей точкой

Недавно мне было любопытно, как работают хэш-алгоритмы для плавающих точек, поэтому я посмотрел на исходники для boost::hash_value. Оказалось, что довольно сложный . Реальные циклы реализации над каждой цифрой в радиусе и накапливают хэш-значение. По сравнению с целочисленными хэш-функциями, это намного сложнее.

Мой вопрос: почему хэш-алгоритм с плавающей точкой должен быть более сложным? Почему бы просто не хэшировать двоичное представление значения с плавающей точкой, как если бы это было целое число?

Например:

std::size_t hash_value(float f)
{
  return hash_value(*(reinterpret_cast(&f)));
}

Я понимаю, что float не гарантированно будет иметь такой же размер, как int на всех системах, но подобные вещи можно было бы обрабатывать несколькими шаблонными мета-программами, чтобы вывести интегральный тип, который имеет такой же размер, как float. Так в чём же преимущество введения совершенно другой хэш-функции, которая специально работает с типами с плавающей точкой?

15
задан mskfisher 9 May 2012 в 19:06
поделиться