Справедливые предположения о реализации std :: hash - PullRequest
0 голосов
/ 13 декабря 2018

Мы используем несколько форм хеширования в проекте исследовательской базы данных.Например, для радикальной кластеризации, где мы используем n младшие значащие биты для определения идентификатора кластера.Мы используем std::hash для хеширования, что нам достаточно.

Однако, хотя мы знаем, что большинство реализаций используют идентичность для хеширования целых чисел, мы наткнулись на тот факт, что хеширование с плавающей запятой (имеет ли это смысл или нетЭто другое обсуждение) по-разному реализовано на разных платформах.

Есть ли какие-либо справедливые предположения, которые мы можем сделать о std::hash?

MacOS: clang version 6.0.1 (tags/RELEASE_601/final) std::hash<float>{}(1.0f): 0000000000000000000000000000000000111111100000000000000000000000 std::hash<double>{}(1.0): 0011111111110000000000000000000000000000000000000000000000000000

Ubuntu: clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) std::hash<float>{}(1.0f): 0101001111100101011001010000100100010100111101010010111101001101 std::hash<double>{}(1.0): 0111010001100001101001000101000001001110110011100111101110011011

1 Ответ

0 голосов
/ 13 декабря 2018

Единственные вещи, которые вы можете предположить, определены стандартом (см. cppreference ).

Это означает:

В частности, они определяют оператор() означает, что:

  1. Принимает один параметр типа Key.

  2. Возвращает значение типа size_t, представляющее хеш-значениепараметр.

  3. Не вызывает исключений при вызове.

  4. Для двух одинаковых параметров k1 и k2 std :: hash () (k1) == std :: hash () (k2).

  5. Для двух разных параметров k1 и k2, которые не равны, вероятность того, что std :: hash () (k1)== std :: hash () (k2) должен быть очень маленьким, приближаясь к 1.0 / std :: numeric_limits :: max ().

Таким образом, вы можете иметь разные значенияна разных платформах, на одной платформе с другой версией компилятора или даже от одного запуска к другому.В вашем случае кажется, что в одном случае вы можете использовать libc ++, а в другом - libstdc ++.

...