генерировать уникальную длину для уникальной начальной строки

#java #string #algorithm #long-integer

#java #строка #алгоритм #длинное целое число

Вопрос:

Мне нужно сгенерировать уникальное Long значение длиной 10 или более цифр из начального числа строки, которое может быть любой длины. В обычных обстоятельствах это было бы невозможно сделать, поскольку существует больше String перестановок, чем Long можно сохранить, однако я знаю, что система не будет генерировать больше Strings , чем я могу сохранить Long , как я могу генерировать уникальные Long для каждого String в таких обстоятельствах?

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

РЕДАКТИРОВАТЬ: я не могу хранить какую-либо информацию об уже обработанных строках, включая их количество

Комментарии:

1. Хм… Если бы это было возможно, будем ли мы по-прежнему использовать map?

Ответ №1:

Вы можете использовать счетчик, подобный этому

 final AtomicLong counter = new AtomicLong();
final Map<String, Long> idMap = new LinkedHashMap<>();

public long idFor(String s) {
    return idMap.computeIfAbsent(s, isMap::incrementAndGet);
}
  

Это вернет уникальный идентификатор для каждой строки.

Комментарии:

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

2. @AkkaJaworek без сохранения какой-либо информации вам нужна стратегия хеширования, которая будет случайной, а не уникальной.

3. @AkkaJaworek или вам нужно средство синтаксического анализа строки с уникальным номером. например, скажем, строка содержит уникальный номер, который вы можете проанализировать.

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

5. Я считаю, что это единственный способ создать уникальный длинный идентификатор из строки.