Пользовательский уникальный идентификатор - PullRequest
2 голосов
/ 11 июля 2011

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

Я хочу использовать уникальный код PHP, но он состоит из 13 цифр и содержит также алфавиты.

Есть идеи?

Спасибо.

Обновление

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

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

Ответы [ 4 ]

3 голосов
/ 11 июля 2011

Почему вы не сохраняете автоинкремент, а устанавливаете его с 10000000 на первичном ключе вместо 1?

ALTER TABLE some_table AUTO_INCREMENT=10000000

1 голос
/ 13 июля 2011

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

Есликлиент хочет скрыть идентификаторы пользователей (для некоторого предполагаемого преимущества безопасности) и сделать их практически невозможными для прогнозирования или обратного инжиниринга, тогда это очень сложно.Если клиенту будет достаточно просто «трудно» предсказать (что я подозреваю), то вы можете сделать что-то простое, похожее на подход md5 (@Dotty).Но md5 не устойчив к столкновениям .И даже с лучшими, доказуемо уникальными хеш-алгоритмами (которых нет в md5), у вас возникнет проблема коллизий, если количество пользователей велико по сравнению с количеством цифр, которые вы можете использовать для идентификаторов пользователей (8).У вас есть около 27 бит для работы с разрешенными 8 десятичными цифрами.Это означает, что вы, вероятно, получите столкновение после 2 ^ N / 2 = 2 ^ (27/2), что составляет около 10 000 пользователей.Таким образом, если список пользователей вашего клиента приближается к 10 000 пользователей, то даже самый лучший алгоритм хэширования потратит много времени на фильтрацию всех коллизий.Чтобы решить эту проблему без фильтров и недетерминированных алгоритмов, просто используйте простой алгоритм " Full Cycle ".Некоторые из них будут производить псевдослучайные числа (PRN), которые гарантированно будут уникальными и будут полностью охватывать любой диапазон, который вы пытаетесь охватить (например, набор всех 8-значных натуральных чисел).И если вам когда-либо понадобится провести обратный инжиниринг последовательности регистрации пользователей, просто перезапустите генератор PRN полного цикла с любым начальным значением, которое вы использовали.И вы можете сохранить это начальное значение в секрете, например, в виде закрытого ключа, если ваш клиент хочет, чтобы хакеру было немного сложнее, чем просто хакеру, перепроектировать вашу последовательность идентификаторов пользователей.

Другой вопрос для вашего клиентаразрешены ли начальные нули в идентификаторе пользователя.Если это так (и требования к случайности клиента либеральны), то простой алгоритм Full Cycle в Википедии будет работать для вас.Это может быть перегнано до 2 строк PHP.Какой бы алгоритм вы ни использовали, было бы неплохо сгенерировать список официальных 8-значных полуслучайных идентификаторов пользователя в отдельной таблице, а затем просто «вытолкнуть» значение из верхней части таблицы (удалив эту строку) всякий раз, когда выдобавить нового пользователяТребования к памяти базы данных не должны быть чрезмерными, и это упростит взаимодействие с пользователем, устраняя любые задержки и сбои памяти, вызванные сложными, недетерминированными генераторами случайных чисел и фильтрами уникальности.Пытаясь создать идентификатор пользователя онлайн, вживую, возможно, вы могли бы попасть в вечный цикл с некоторыми алгоритмами хэширования, которые задерживают вашу регистрацию пользователя на неопределенное время.И эта остановка (из-за постоянной коллизии) может не произойти до 1000 или 10000 пользователей. Напротив, с подходом автономной таблицы поиска вы можете легко добавить дополнительные предписанные клиентом фильтры, такие как удаление идентификаторов с ведущими нулями;в случае, если клиент никогда не хочет видеть пользователя с идентификатором 1 (00000001).И вы бы заранее знали, будет ли все работать всегда, без каких-либо зависаний.

1 голос
/ 11 июля 2011

Да, вы можете.Я предполагаю, что вы находитесь на MySQL, когда говорите об искусственном интеллекте.Только не устанавливайте его как автоинкремент и вставьте значение, как для других столбцов.Вы можете создать функцию или метод, который будет принимать до 8 чисел случайным образом или в определенном порядке (алгоритм).

INSERT INTO model (id, name, value, etc) VALUES (87654321, 'My selected name', 'some price or text', 'etc').

Учтите, что значение INT (11) может принимать отОт -2147483648 до 2147483647. Который подойдет вам для цифр с 8 цифрами.Если позднее клиент запросит большие числа, вам может потребоваться переключиться на BIGINT.

Я использую для установки первичных ключей как беззнаковых, что позволяет подбирать цифры от 0 до 4294967295.

Для функции php - генератор 8 цифр:

<?php

mt_srand();
$id = mt_rand(10000000, 99999999);

?>

Подробнее о mt_srand () и mt_rand () вы можете прочитать в документации php.Говорят, что они лучше, чем srand () и rand ().

1 голос
/ 11 июля 2011

Сохраните ID, но добавьте его.

$id = 6;
$padded_id = sprintf("%013d", $id);
// This will print 0000000000006

Это дополнит $id, так что его длина будет 13 цифр.

Каждый раз, когда вам нужно отобразитьID используйте функцию для ее преобразования, например так.

function padId($id){
    return sprintf("%013d", $id);
}

Или вы можете создать в своей таблице строку с именем pad-id, а затем запустить эту функцию при создании записи (вместе с * 1013).* (чтобы вставить ID только что вставленный)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...