у меня есть users
table и мне нужно создать уникальный случайный алфавитно-цифровой «id» для каждого пользователя (у них уже есть автоинкрементные идентификаторы, как обычно). Этот идентификатор должен:
AAAA-1234
(4 буквы, 4 цифры)Есть ли лучший способ, чем сохранять случайно генерируемые строки, пока я не найду тот, которого еще нет в базе данных?
Назначьте каждому пользователю целое число в старом скучном последовательном порядке (или используйте тот другой идентификатор, который вы упомянули). Назови это $x
,
Задавать $x = (($x + 2135587861) * 2654435769) & 0xffffffff
,
Задавать $x = $x ^ ($x >> 15)
,
Задавать $x = (($x + 2135587861) * 2654435769) & 0xffffffff
снова.
подсчитывать $x % 26
и выберите букву a-z в зависимости от результата. Задавать $x = $x / 26
, Повторите четыре раза (я не знаю PHP, поэтому вы получите здесь устные инструкции).
подсчитывать $x % 10
и выберите цифру 0-9 в зависимости от результата. Задавать $x = $x / 10
, Повторите четыре раза.
Первые шесть результатов, которые я получаю:
HSQG-2102
DNQO-1176
TEKJ-5435
EHWX-6540
UPPH-0450
MVIX-5036
Это не совсем идеально, но это не очевидно. Возможно, этого достаточно.
Кроме того, он работает только для первых 4 миллиардов (пользователей), прежде чем вы получите коллизии, но это все равно немного далеко от ограничения формата строки.
Других решений пока нет …