Хранение случайных строк без дубликатов в базе данных

#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, чтобы быть точным.