Какой бы метод вы ни использовали, у вас будут проблемы, потому что вы поставили что-то, что невозможно решить.
То, что вы хотите, это: 1) равномерно распределенный хеш, так что для большинства чисел a и b, где a! = B, затем a.GetHashCode ()! = B.GetHashCode () но 2) где a == b, то a.GetHashCode () == b.GetHashCode () должен быть истинным.
Возвращение константы выполняет (2), но не (1).
Вы можете продемонстрировать, что округление в границах 1E-5 и использование его в качестве хеша нарушает выполнение (1), но нарушает (2). Возьмите 1E-5 и 2E-5, например. Округление даст два разных значения хеша, но они будут сравниваться одинаково. Это нарушает ограничение (2) выше. Вы можете легко обобщить это, чтобы доказать, что любое округление числа столкнется с подобной проблемой.
Я рекомендую вам выбрать другой подход. Я предполагаю, что основная проблема заключается в том, чтобы определить, близка ли какая-либо точка к точке, которая у вас уже есть. Я рекомендую рекурсивное разделение координатного пространства пополам (где точки вдоль границы (т. Е. <= 1E-5 от границы) на обе половины). Если вы постепенно делите свое пространство (например, двоичное дерево), вы можете создать структуру данных, которая быстро вернет желаемый результат и будет довольно легко построить. </p>
Если я пропустил свое предположение, и вы должны использовать хеш, то можете делать то, что хотите, с двумя значениями хеш-функции, каждое из которых округляется до 1E-5, но смещено на 5E-6. Все равные точки будут сравниваться равными по одному из двух значений хеша. Для этого потребуется дважды ввести точку в хеш-таблицу, по одному разу для каждой хеш-процедуры.