![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
На сайте постоянно создаются заказы. На каждый заказ необходимо сгенерировать уникальный id. Он должен быть достаточно простым для восприятия человеком и обязательно не должен повторятся.
Нельзя использовать id с базы данных и как либо на него ориентироваться. Пока придумал подвязаться на time() и частично перевести его в цифры. Для лучшей читаемости. Примерно так
в результате получаю примерно такой код WKI0-811 в конец добавляю rand(10,99) для исключения дубляжей в ту же секунду. Получаю такое WKI0-811-45 Длинна и сложность кода устраивает. Не нравится 1. Возможность дубляжей хоть и очень небольшая. 2. Окончание 811 очень редко изменяется. Поскольку это грубо говоря года из time(). Также я уверен что есть более красивые решения. Спасибо за внимание Это сообщение отредактировал(а) taral - 20.3.2013, 23:35 |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
Можно просто перевести unix-timestamp в 26-ичную систему счисления с буквами английского алфавита в качестве символов.
Время написания данной строки тогда будет выглядеть так: "EKULRDV" Повторения в пределах секунды исключены. Можно добавить миллисекунды в конец: "EKULRDV903". Теперь повторения почти невозможны физически. О переводе чисел в K-ичную систему можно почитать где угодно. К счастью, у меня завалялся пример:
Добавлено через 5 минут и 7 секунд Словарь можно изменить абсолютно любым угодным вам образом. Далеко не обязательно упорядочивать буквы по алфавиту. Функции перевода все равно. Если вас беспокоит излишняя "предсказуемость" кода, то просто перемешайте буковки. Можете туда и циферок и циферок в случайные места вставить, и разделять по 3 буквы дефисом (уже после конвертирования), если хотите. Выйдет что-то вроде UJ2-ЗNK-8 Если не менять словарь, то повторения в пределах секунды по прежнему невозможны. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
||||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
||||
|
||||
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Большое спасибо за ответы.
Скорее всего буду использовать ваш пример Arantir baldina я согласен с тем что удобнее сообщать цифры. Но мне поставлены жесткие требования. И с этим ничего не поделать =) |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
закодируйте дату буквами (ДМГ), номер цифрами
день 1-26 - WA-WZ, 27-31 YA-YE месяц 1-12 - A-L год 2010-2036 A-Z счет номер 45 от 21.03.2013 будет WUCD-045 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
в свете собственных слов про трудность передачи по телефону, особенно людьми, у которых английский последний раз был в школе, советую отобрать буквы, которые легко читаются/понимаются и которые сложно перепутать(из пары "M-N" или "E-I" взять только одну)
|
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
skyboy, но даты и цифры читаются вполне нормально учениками старше 3го класса
![]() В общем автор юлит в чем-то. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
taral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Нет. Просто на сайте используется база данных mongo. Где id 513bb26adffa82cf0a000042. А нужно выводить клиенту id заказа в нормальном виде. Причем заказов может быть очень много. По крайней мере заказчик настаивает на 100% уникальность. По этой причине если взять просто time() . rand(0,999) будет очень много цифр. Получить int по количеству заказов тоже не вариант потому что они могут удалятся. По причине большого кол. цифр выбрали заменить часть их на буквы. Тем более что заказчику нравится когда вначале буквы и дальше цифры. И смысла его переубеждать в этом нет =) |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
В чем прикол? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
а может проще использовать во этот формат?
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
идея неплохая, но будут повторы
подошло бы наверно что-то вроде date_format('Symd-siH-u'); Добавлено через 2 минуты и 39 секунд только оно не работает)))) значит так:
Добавлено через 4 минуты и 30 секунд лучше наверно
Добавлено через 4 минуты и 40 секунд http://liveworkspace.org/code/4jkooo$0 |
||||
|
|||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
при условии генерации более одного id в день
http://liveworkspace.org/code/4jkooo$1 Добавлено через 1 минуту и 34 секунды 365 в год мне кажется не очень большим числом заказов ![]() |
|||
|
||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
а вообще, задача изначально глупая.. Зачем что-о выдумывать когда есть порядковый номер. Ну если нет возможности использовать ID, ну так сделай отдельное поле.. и при следующем заказе делай запрос MAX(`field`), прибавляй единицу и радуйся. Не нравятся цифры. ну так замени буквами...
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |