#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. Я считаю, что это единственный способ создать уникальный длинный идентификатор из строки.