#java #string #random
Вопрос:
Я создаю строки для использования в качестве идентификаторов, поэтому, чтобы избежать повторений, я должен в настоящее время проверить в своей базе данных, была ли эта строка уже назначена, и если да, сгенерируйте другую, я хочу избежать переделки вычисления другой строки.
Я могу генерировать и хранить все возможные строки, чтобы назначать их быстрее, но эта идея меня не убеждает
Можете ли вы придумать что-нибудь более эффективное?
Я редактирую: требование требует, чтобы я использовал идентификаторы этого типа, ничего личного;)
Срок службы каждого идентификатора составляет 24 часа
Комментарии:
1.
Remove a string after it has been chosen.
2. Как долго длится удостоверение личности? Имеет ли идентификатор определенный формат, например
XXX###
, где X-буква, а # — цифра, или это последовательность случайных символов? Это диапазонA-Z
или только два символаAZ
?3. Вы можете использовать карту (возможно, хэш-карту) для хранения идентификаторов, которые вы использовали. Сохраните строку вместе с датой и временем, чтобы вы могли удалить их, когда срок их действия истечет.
4. обратите внимание, что проблема с днем рождения полезна для определения того, сколько состояния вам нужно сохранить. т. Е. Именно поэтому @rzwitserloot говорит, что вам нужно 128 бит, этого достаточно, чтобы вряд ли возникло какое-либо столкновение, пока вы не начнете хранить около 2^64 идентификаторов
Ответ №1:
Это чрезвычайно распространенная проблема. Ваша стратегия звучит как очень плохой способ ее реализации. Конечно, ты не хотел на самом деле этого делать.
Используйте правильный инструмент для работы: пусть база данных решит эту проблему
Базы данных имеют понятие последовательностей / автоматически увеличивающихся первичных ключей. База данных просто… позаботится об этом. Всякий раз, когда вы добавляете строку в базу данных, просто не указывайте вообще никакого идентификатора, и база данных сгенерирует его для вас, и он будет гарантированно уникальным. Например, почти в каждой БД есть тривиальный синтаксис для этого как части CREATE TABLE
инструкции CREATE TABLE foo (id SERIAL);
.
Используйте правильный инструмент для работы: Индексы
Сделайте идентификатор либо первичным ключом, либо иным образом сообщите базе данных, что вы хотите, чтобы он был уникальным (в некоторых базах данных вы добавляете ограничение «УНИКАЛЬНЫЙ». В других случаях вы добавляете индекс для этого столбца с помощью CREATE INDEX
и указываете, что он должен быть ОТДЕЛЬНЫМ или УНИКАЛЬНЫМ — это области, в которых базы данных не сильно стандартизированы по синтаксису SQL, и вы не упомянули, какой компонент базы данных вы здесь используете. Нетрудно будет поискать инструкции в Интернете).
Как только вы сделаете это и попытаетесь добавить строку с идентификатором, который вы уже использовали ранее, инструкция просто завершится ошибкой. Вы можете поймать это исключение SQLException, а затем просто начать все сначала и случайным образом сгенерировать другое. В базе данных используется индексированная проверка, которая выполняется довольно быстро.
Используйте правильный инструмент для работы: UUID
Проблема «Я хочу быстро сгенерировать идентификатор и, тем не менее, будьте уверены, что он определенно, абсолютно уникален» Настолько распространена, что она уже решена. Познакомьтесь с UUID. В Java для этого есть API, и многие базы данных поддерживают его изначально. Так что сделайте свой тип столбца UUID
и не VARCHAR
.
Да, они большие. Если вы хотите, скорости и гарантии, она должна быть достаточно большой, что стохастические коэффициенты случайности, производящих один и тот же идентификатор, чтобы быть настолько низким, что генерация идентификаторов каждую секунду в течение остальной части жизни Вселенной до сих пор не причинит 2 одинаковых, если вам очень не повезло (0.000000000000000001% уровне не везет), нужно бросить больше битов на проблему. 128, чтобы быть точным.