Хэш-код Java строки от 0 до 1

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

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


person K2xL    schedule 27.03.2012    source источник
comment
Зачем вам нужен такой хэш-код?   -  person Petro Semeniuk    schedule 27.03.2012
comment
hashCode() — это метод, определенный в Object, родительском классе для всех классов Java, и возвращает значение типа int. Это не может быть изменено. Объясните свое намерение, и мы, возможно, сможем предоставить решение...   -  person pmckeown    schedule 27.03.2012
comment
Вы всегда можете написать свой собственный метод, который возвращает двойное значение в этих границах (хотя и не с именем hashCode()), но чего вы хотите достичь?   -  person ftr    schedule 27.03.2012
comment
@PetroSemeniuk Я выполняю математическую операцию и пытаюсь сгруппировать разные объекты для выполнения одной и той же математической операции в своей группе, но с другим параметром в функции. у каждого члена есть список характеристик, которые их группируют... поэтому я подумал поместить характеристики в строку, а затем хеш-кодировать ее и найти их групповое значение из этого   -  person K2xL    schedule 27.03.2012
comment
@K2xL: если два объекта имеют одинаковый хэш-код, это НЕ означает, что они равны. Более того, это даже НЕ означает, что они чем-то похожи. Вероятно, вам следует найти какой-то другой способ группировки объектов.   -  person bezmax    schedule 27.03.2012
comment
@Max, я знаю, что есть вероятность, что будут коллизии, но в этой конкретной операции, которую я выполняю, это не имеет значения.   -  person K2xL    schedule 27.03.2012


Ответы (3)


Вы не могли просто разделить на Integer.MAX_VALUE, так как это не имело бы дело с отрицательными числами. Вы можете использовать:

private static double INTEGER_RANGE = 1L << 32;
...
// First need to put it in the range [0, INTEGER_RANGE)
double doubleHash = ((long) text.hashCode() - Integer.MIN_VALUE) / INTEGER_RANGE;

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

person Jon Skeet    schedule 27.03.2012
comment
Забавный факт: 0x1.0p32 — это то, как вы указываете двойную константу в шестнадцатеричном формате. - person Louis Wasserman; 27.03.2012
comment
@LouisWasserman: Это одно из улучшений Java 7 или оно было там какое-то время? - person Jon Skeet; 27.03.2012
comment
Ява 5! blogs.oracle.com/darcy/entry/ - person Louis Wasserman; 27.03.2012

Деление должно быть в порядке, но вы можете потерять некоторую «точность» из-за проблем с округлением и т. д., которые могут быть у двойников.

Как правило, хеш используется для идентификации чего-либо, чтобы гарантировать, что оно будет уникальным, потеря точности может привести к проблемам в этом.

Вы можете написать свой собственный String.hashCodeDouble(), возвращающий желаемое число, возможно, используя общий алгоритм хеширования (скажем, MD5) и адаптируя его к требуемому диапазону ответов.

Пример: выполните MD5 строки, чтобы получить хэш, затем просто поставьте перед ней 0....

Помните, что .hashCode() используется во многих функциях Java, вы не можете просто перезаписать его.

person woliveirajr    schedule 27.03.2012

Это плохо пахнет, но может делать то, что вы хотите:

Integer iHash = "123".hashCode();
String sHash = "0."+iHash;
Double dHash = Double.valueOf(sHash);
person Marcelo    schedule 27.03.2012