Как я могу создать длинный хэш строки? - PullRequest
8 голосов
/ 16 февраля 2012

У меня есть приложение Java, в котором я хочу сгенерировать long идентификаторы для строк (чтобы сохранить эти строки в neo4j ). Чтобы избежать дублирования данных, я хотел бы сгенерировать идентификатор для каждой строки, хранящейся в целом числе long, который должен быть уникальным для каждой строки. Как я могу это сделать?

Ответы [ 4 ]

12 голосов
/ 07 сентября 2017

Этот код вычислит довольно хороший хеш:

String s = "some string";
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits();
7 голосов
/ 16 февраля 2012

Почему бы вам не взглянуть на функцию hashcode() в String, а просто использовать вместо нее длинные значения?

Btw. если бы был способ создать уникальный идентификатор для каждой строки, то вы бы нашли алгоритм сжатия, который мог бы упаковать каждую строку в 8 байтов (по определению невозможно).

5 голосов
/ 16 февраля 2012

long имеет 64 бита.A String длиной 9 имеет 72 бита.от принцип голубиного отверстия - вы не можете получить уникальное хеширование для длинных строк из 9 символов до long.

Если вам все еще нужен long хеш: вы можете просто взять два стандартных[разные!] хеш-функции для String->int, hash1() и hash2() и вычисления: hash(s) = 2^32* hash1(s) + hash2(s)

1 голос
/ 16 февраля 2012

Есть много ответов, попробуйте следующее:

Или, как предложено ранее, проверить источники.

PS.Еще один прием - поддерживать словарь строк: так как вы вряд ли получите 2 64 строк в ближайшее время, вы можете получить идеальное отображение.Обратите внимание, что это отображение может также стать основным узким местом.

...