Хороший алгоритм для генерации номера заказа

Вот ссылка на список из Ярлыков, которые я нахожу полезными (VS2003), но некоторые все еще применяются,

Мой фаворит, являющийся F12 и Ctrl + - для навигации к объявлению и назад

9
задан Jason 20 January 2014 в 23:53
поделиться

10 ответов

Если средний уровень не может проверить, какие «номера заказов» уже существуют в базе данных, лучшее, что он может сделать, будет эквивалентным генерации случайного числа. Однако, если вы генерируете случайное число, которое должно быть меньше 1 миллиарда, вы должны начать беспокоиться о случайных столкновениях примерно на sqrt (1 миллиард) , то есть после нескольких десятков тысяч записей, сгенерированных таким образом , риск столкновения существенный. Что, если порядковый номер является последовательным, но замаскированным, то есть следующим кратным некоторого большого простого числа по модулю 1 миллиард - будет ли это соответствовать вашим требованиям?

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

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

после нескольких десятков тысяч записей, созданных таким образом, риск столкновения становится существенным. Что, если порядковый номер является последовательным, но замаскированным, то есть следующим кратным некоторого большого простого числа по модулю 1 миллиард - будет ли это соответствовать вашим требованиям?

после нескольких десятков тысяч записей, созданных таким образом, риск столкновения становится существенным. Что, если порядковый номер является последовательным, но замаскированным образом, то есть следующим кратным некоторого большого простого числа по модулю 1 миллиард - будет ли это соответствовать вашим требованиям?

8
ответ дан 4 December 2019 в 10:32
поделиться

<Моан> ОК звучит как классический случай преждевременной оптимизации. Вы представляете себе проблему с производительностью (о, боже, мне нужно получить доступ к - ужасной - базе данных, чтобы получить номер заказа! У меня это может быть медленным), и в итоге вы получите запутанный беспорядок из псевдослучайных генераторов и тонну дублирующего кода обработки. < / moan>

Один простой практический ответ - запустить последовательность для каждого клиента. Реальный номер заказа представляет собой смесь номера клиента и номера заказа. Вы можете легко получить последнюю использованную последовательность при получении других сведений о вашем клиенте.

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

Один простой практический ответ - запустить последовательность для каждого клиента. Реальный номер заказа представляет собой смесь номера клиента и номера заказа. Вы можете легко получить последнюю использованную последовательность при получении других сведений о вашем клиенте.

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

Один простой практический ответ - запустить последовательность для каждого клиента. Реальный номер заказа представляет собой смесь номера клиента и номера заказа. Вы можете легко получить последнюю использованную последовательность при получении других сведений о вашем клиенте.

5
ответ дан 4 December 2019 в 10:32
поделиться

Один из простых вариантов - использовать дату и время, например. 0912012359, и если два заказа получены в одну и ту же минуту, просто увеличьте второй заказ на минуту (не имеет значения, если время истекло, это просто номер заказа).

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

Ваши конкуренты ничего не извлекут из этого, и это легко реализовать.

2
ответ дан 4 December 2019 в 10:32
поделиться

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

Просто предупреждение - см. здесь , что может произойти, если вы не осторожны со своими настройками.

1
ответ дан 4 December 2019 в 10:32
поделиться

One solution would be to take the hash of some field of the order. This will not guarantee that it is unique from the order numbers of all of the other orders, but the likelihood of a collision is very low. I would imagine that without "doing a round trip to the database" it would be challenging to make sure that the order number is unique.

In case you are not familiar with hash functions, the wikipedia page is pretty good.

1
ответ дан 4 December 2019 в 10:32
поделиться

GUID можно было закодировать с помощью base64. Это будет соответствовать всем вашим критериям, кроме требования «только числовые значения».

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

1
ответ дан 4 December 2019 в 10:32
поделиться

The straightforward answer to most of your bullet points:

Make the first six digits a sequentially-increasing field, and append three digits of hash to the end. Or seven and two, or eight and one, depending on how many orders you envision having to support.

However, you'll still have to call a function on the back-end to reserve a new order number; otherwise, it's impossible to guarantee a non-collision, since there are so few digits.

0
ответ дан 4 December 2019 в 10:32
поделиться

Use primitive polynomials as finite field generator.

1
ответ дан 4 December 2019 в 10:32
поделиться

Мы выполняем TTT-Flag-1A-N1.

  • T = Тип цепи (D1E = DS1 EEL , D1U = DS1 UNE и т. Д.)
  • C = 6-значный идентификатор клиента
  • 1 = первое местоположение клиента
  • A = первый контур (A = 1, B = 2 и т. Д.) В этом местоположении
  • N = Тип заказа (N = Новый, X = Отключить и т. Д.)
  • 1 = Первый такой порядок для данной схемы
0
ответ дан 4 December 2019 в 10:32
поделиться

Требование 10 цифр является огромным ограничением. Рассмотрим двухэтапный подход.

  1. Используйте GUID
  2. Префикс GUID с помощью 10-значного (или 5- или 4-значного) хеш-кода GUID.

У вас будет несколько совпадений по хеш-значению. Но не так много. Специалисты по обслуживанию клиентов очень легко смогут выяснить, о каком заказе идет речь, на основе дополнительной информации от клиента.

1
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: