На самом деле у вас есть два варианта:
- Создание чего-либо и проверка отсутствия столкновений
- Создай что-нибудь и надейся на отсутствие столкновений
Обычно вы можете использовать следующие опции:
- хеш
- случайно сгенерированная строка
- UUID
Hash
Если вы выбираете хеш, выбирайте что-то с низкой частотой столкновений. Кроме того, при выполнении хэша учитывайте, почему вы хотите скрыть идентификаторы БД. Кто-то не займет много времени, чтобы выяснить ваши хэши, если вы хэшируете простые числа, вам абсолютно необходимо засолить их. Преимущества соленого хэша - быстрая генерация и низкая вероятность коллизий (в небольших случаях абсолютно нет необходимости проверять их, поэтому более быстрые вставки). Недостатком является то, что любая правильная реализация будет SHA256 или лучше, что означает, что это долго. Вы можете сделать несколько шестнадцатеричных преобразований, если хотите сэкономить пространство DB / Index, которое может быть больше, чем вы хотите.
Случайная строка
Это вы можете генерировать для любой длины, которая подходит вам, любого набора символов или чисел a-Z0-9. Это также означает «больше» данных в более короткой строке, которая используется в URI, данных REQUEST и т. Д. Недостатком является то, что вы должны проверить, находится ли он в базе данных.
UUID
Подобно хешу, быстро генерируемому, довольно низкому риску коллизий и может быть изменен, чтобы быть «менее» уродливым, чем чистый результат.
Мое предложение
Не делай этого. Я имел дело с этим раньше на очень большой реализации, которая выросла из очень маленькой реализации. В конце концов вы начинаете делать «умные» вещи, такие как создание совершенно уникальных идентификаторов (например, тип контента + ваш идентификатор) и начинаете видеть какое-то значение в нем, но затем вам приходится иметь дело с масштабом. Масштабировать это очень сложно. БД оптимизированы для идентификаторов в качестве первичных ключей, поэтому нужно удивительно много думать о них, если вы хотите, чтобы они масштабировались по вертикали. Если необходимо, используйте его только для взаимодействия с внешним клиентом.