[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уникальный числовой Order ID
Страницы: 1, 2
I++
Возможно у кого тоже рождалась в закромах такая мысль, чтобы при заказе на сайте пользователю не выдавался унылый ID типо: Номер вашего заказа 10001 тут и дурак поймет, что походу я тут первый покупатель biggrin.gif

Основная идея, получить числовой короткий Order ID фиксированной длины и чтобы по разным order id нельзя было вычислить количество покупателей. Какие есть идеи?

При этом не забываем о коллизиях.
Гугл конечно рулит, но он всякую хрень выдает, или не фиксированной длины smile.gif
Invis1ble
ну на вскидку генерируешь на пыхе рандомную строку и проверяешь, чтоб в БД такой не было
типа такого:
do {
$id = generateId();
} while (естьЛиВБДТакойID($id));

возможно есть более оптимальные способы, например генерация на стороне СУБД. Не интересовался этим вопросом.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Игорь_Vasinsky
пффф..

ну прибавляй к каждому номеру заказа 11762, начиная с первого

делов то.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
I++
Игорь_Vasinsky

а если в базе autoincrement? :D

Прибавил:

11762
23524
47048
94096
188192
376384
752768
1505536
3011072
6022144
12044288
24088576
48177152
96354304
192708608
385417216
770834432
1541668864
3083337728
6166675456
12333350912
24666701824
49333403648
98666807296
197333614592
394667229184
789334458368
1578668916736
3157337833472
6314675666944
12629351333888
25258702667776
50517405335552
1.010348106711E+14
2.0206962134221E+14
4.0413924268442E+14
8.0827848536883E+14
I++
Ага продиктуйте свой номер заказа: 6ccd780c-baba-1026-9564-0040f4311e29 biggrin.gif
Игорь_Vasinsky
 $num = time()/100000;

$t = explode('.', $num);

echo ($t[0] + ($t[1]) ? $t[1] : 0);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
I++
Эта функция создает коллизии.

Вот чего выводит:


70464
70464
70464
70464
70464
70464
70464
70464
70464
70464
70464
70464
Игорь_Vasinsky
ну так с математикой поиграй. возьми microtime()

для красоты

echo preg_replace("/(\d{2})$/", "-$1", ($t[0] + ($t[1]) ? $t[1] : 0));


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
Цитата (I++ @ 20.11.2014 - 07:38)
Номер вашего заказа 10001 тут и дурак поймет, что походу я тут первый покупатель

CREATE TABLE orders (
id bigint unsigned not null auto_increment,
primary key(id),
auto_increment=45751
);

так не поймет
Игорь_Vasinsky
слишком просто.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
AlmazDelDiablo
Был один очень классный магазин, где ID заказов сбрасывались каждый день. Очень удобно с точки зрения покупателя:
— Назовите номер вашего заказа.
— Три.

Profit! До сих пор с теплом вспоминаю этот магазин, когда в очередном авто-инкреметном или unique_id-шном магазине приходится диктовать десятизначные номера...

_____________
Блог | VK | GitHub | Twitch
Hello
I++
Делай префикс к номеру заказа в виде

$pre = ((13 * (date('y')%6)) + date('m')) . date('d');

+ ежедневно обнуляемый счетчик заказов.
Получиться 37201, 37202 ... 3720321
По первым 4м цифрам определяется дата продажи (коллизия через 6 лет)

_____________
VPS от 5$, первые 2 месяца - бесплатно.
I++
Hello, о интересная идейка
sergeiss
Вот есть еще вариант. Формируешь некое произвольное число функцией "рандом", в определенном диапазоне, и проверяешь, есть ли такое в таблице. Если его нет, то используешь. Если есть, то пробуешь другое. И так далее, пока не подберешь :)
Вся тонкость в том, что делаешь это всё внутри функции в самой БД. Тогда скорость выполнения будет достаточно большой. Если же задействовать ПХП, то на общении ПХП с БД очень много времени потеряешь.
Вот пример такой функции, сделанный в Постгре. Возвращается числовой идентификатор определенной длины, но в виде символьной строки (так было удобнее, чем в числовом виде, потому что предполагается, что в будущем айди могут стать смешанными символьно-числовыми). Думаю, что в Мускуле тоже можно такое изобразить.

Функция:
Свернутый текст
CREATE FUNCTION get_id_unique() RETURNS character varying
LANGUAGE plpgsql
AS $$
declare
id_unique_new varchar(10);
id_count integer;
loop_counter bigint;
begin

loop_counter := 0;
LOOP

id_unique_new := cast( cast( 1000000000 + random()*9999999999 as bigint) as varchar(10));

select c into id_count from ( select count(*) as c from id_unique where id_unique = id_unique_new) ini_sel;
if id_count = 0 then
EXIT;
end if;

loop_counter := loop_counter + 1;
if loop_counter = 9999999999 then
id_unique_new := '0000000000';
EXIT;
end if;
END LOOP;

insert into id_unique (id_unique) values (id_unique_new);

return id_unique_new;

end;
$$;


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.