Лучший способ создания непредсказуемого короткого буквенно-цифрового идентификатора для записей в базе данных

Я работаю над сайтом с желтыми страницами, на котором около 1 миллиона записей. В настоящее время я использую случайный хэш md5 в качестве идентификатора, но думаю, что это плохая идея (будучи длиннее, занимает больше места).

Есть ли более приятный способ создания непредсказуемого, случайного, короткого буквенно-цифрового идентификатора в PHP, кроме использования uniqid() функция. Я не использую идентификаторы автоинкремента, base64 и т. Д., Поскольку очистка данных будет очень простой.

1 ответ

Вы хотите, чтобы они были не только непредсказуемыми, но и уникальными.

Вот методика: случайно придумать два очень больших простых числа. Назовите их р и д. q должно быть больше, чем р. Держите эти цифры в секрете, потому что вы будете использовать их в качестве генератора ключей с этого момента.

Каждый раз, когда вы хотите сгенерировать новый идентификатор:

  • Позволять n = (number_of_rows) + 1;
  • Позволять id = p^(n) MOD q

Большинство больших библиотек имеют powermod метод, так было бы

 let n = (number_of_rows) + 1;
 let id = powermod(l, n, m);

Если для моих простых чисел я выбрал

p = 533000401
q = 553105243

затем

533000401^1 mod 553105243 = 533000401
533000401^2 mod 553105243 = 338207751
533000401^3 mod 553105243 = 288526476
533000401^4 mod 553105243 = 520004588
533000401^5 mod 553105243 = 485019742
533000401^6 mod 553105243 = 154299236
533000401^7 mod 553105243 = 345441135
533000401^8 mod 553105243 = 548307409
533000401^9 mod 553105243 = 352554000
533000401^10 mod 553105243 = 116366514
533000401^11 mod 553105243 = 262938285
533000401^12 mod 553105243 = 551979652
533000401^13 mod 553105243 = 81299520
533000401^14 mod 553105243 = 485628040
533000401^15 mod 553105243 = 129148293
533000401^16 mod 553105243 = 77088382
533000401^17 mod 553105243 = 377106983
533000401^18 mod 553105243 = 533584982
533000401^19 mod 553105243 = 362875056
533000401^20 mod 553105243 = 432282485

Даже если это кажется случайным, вы гарантированно не получите повторений, пока не достигнете q

Конечно, если кто-то выяснит, каковы ваши два начальных простых числа, он сможет угадать следующее число из предыдущего, поэтому вам придется держать их в секрете. Но я не верю, что есть способ выяснить, что такое исходные номера (если не считать просто попытки каждой возможной пары простых чисел, что по причине займет непомерно много времени).

Вот страница на скрипте.NET, чтобы продемонстрировать это: https://dotnetfiddle.net/oUkbvy

Другие вопросы по тегам