Java воссоздает строку из хеш-кода - PullRequest
7 голосов
/ 13 июня 2011

Есть ли способ, которым я могу использовать хеш-код строки в Java и воссоздать эту строку?

например, что-то вроде этого:

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);

Я говорю это, потому что ядолжен превратить строку в целочисленное значение и восстановить эту строку из этого целочисленного значения.

Ответы [ 5 ]

5 голосов
/ 13 июня 2011

Это невозможно. Хеш-код для String с потерями; много значений String приведут к тому же хеш-коду. Целое число имеет 32-битные позиции, и каждая позиция имеет два значения. Невозможно отобразить даже 32-символьные строки (например) (каждый символ имеет множество возможностей) в 32-битные без коллизий. Они просто не подходят.

Если вы хотите использовать арифметику произвольной точности (скажем, BigInteger), то вы можете просто взять каждый символ как целое и объединить их все вместе. Вуаля.

4 голосов
/ 13 июня 2011

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

2 голосов
/ 13 июня 2011

Невозможно, я боюсь. Подумайте об этом, хеш-код - это длинное значение, то есть 8 байтов. Строка может быть меньше этой, но также может быть намного длиннее, вы не можете сжать более длинную строку в 8 байтов, не потеряв что-либо.

Алгоритм хэш-кода Java суммирует каждый 8-й байт, если я правильно помню, чтобы вы потеряли 7 из 8 байт. Если ваши строки очень короткие, вы можете закодировать их как int или long, не теряя ничего.

0 голосов
/ 31 августа 2015

Например, «1019744689» и «123926772» оба имеют хэш-код -1727003481.Это доказывает, что для любого целого числа вы можете получить другой результат (например, reversehashcode(hashcode(string)) != string).

0 голосов
/ 14 августа 2012

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

log_70{2^32} = 5.22...

Это означает, что для любого заданного целого числа вы найдете 5- или 6-символьная строка с этим в качестве хеш-кода.Итак, получение "Hello World": невозможно;но "Hello" может сработать, если вам повезет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...