2016-06-14 3 views
0

У меня есть таблица users, и мне нужно создать уникальный, случайный буквенно-цифровой «идентификатор» для каждого пользователя (у них уже есть автоинкрементные идентификаторы, как обычно). Этот идентификатор должен:Как создать случайные поисковые уникальные идентификаторы, которые соответствуют заданному шаблону

  • быть уникальным
  • случайные ищет
  • соответствуют шаблону AAAA-1234 (4 буквы, 4 цифры)

есть лучший способ, чем держать случайно не генерируя строки до Я нашел тот, которого нет в базе данных еще?

+0

Когда вы говорите «случайный взгляд», вы имеете в виду, что цифры не должны быть косвенными? –

+0

@PavelPetrov точно – nXu

+0

Может быть, вам нужен алгоритм, похожий на тот, который генерирует номера кредитных карт. Вероятно, вы получите лучший ответ, если зададите этот вопрос в Cryptography SE. –

ответ

2

Назначьте каждому пользователю целое число в расторжении старого последовательного заказа (или используйте этот другой идентификатор, который вы упомянули). Назовите это $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 миллиардов пользователей (ish), прежде чем вы получите столкновения, но это все равно немного далеко от префикса строкового формата.

+0

Я действительно не понимаю числа здесь, но если я правильно вижу это, это означает, что каждый $ x будет отображать только одну строку, которая будет уникальной до $ x <16^8, правильно? – nXu

+1

Да, они уникальны до этого предела. Все магические числа произвольны, и я просто выбрал некоторые, которые, казалось, работали. Я использовал первые 64 бит золотого отношения. Единственное ограничение состоит в том, что множитель должен быть нечетным - это имеет математическое свойство, что все возможные входные данные сопоставляются с уникальным выходом даже после '& 0xffffffff'. Поскольку все операции имеют одно и то же свойство, мы знаем, что мы не складываем два входа в один и тот же вывод (столкновение) и теоретически можем отменить операцию, чтобы обнаружить исходный номер. – sh1

+0

Спасибо за объяснение! – nXu

Смежные вопросы