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

Каждый заказ в моем интернет-магазине имеет номер заказа, ориентированный на пользователя. Мне интересно, как их создать. Критерии включают:

  • Короткие
  • Легко сказать по телефону (например, "m" и "n" являются двусмысленными)
  • Уникальный
  • Контрольная сумма (overkill? Полезно?)
  • Изменить: Не показывает, сколько всего заказов было (клиент может найти, что он нервничает, чтобы сделать ваш третий заказ)

Сейчас я использую следующий метод (без контрольной суммы):

def generate_number                
    possible_values = 'abfhijlqrstuxy'.upcase.split('') | '123456789'.split('')

    record = true
    while record
        random = Array.new(5){possible_values[rand(possible_values.size)]}.join
        record = Order.find(:first, :conditions => ["number = ?", random])
    end          
    self.number = random
end

Ответы

Ответ 1

Будучи клиентом, я был бы доволен:

year-month-day/short_uid

например:

2009-07-27/KT1E

Это дает место для порядка 33 ^ 4 ~ 1 млн. порядков в день.

Ответ 2

Вот реализация для системы я предложенная в более раннем вопросе:

MAGIC = [];
29.downto(0) {|i| MAGIC << 839712541[i]}

def convert(num)
  order = 0
  0.upto(MAGIC.length - 1)  {|i| order = order << 1 | (num[i] ^ MAGIC[i]) }
  order
end

Это просто дешевая хеш-функция, но это усложняет для среднего пользователя возможность определить, сколько заказов было обработано, или номер для другого заказа. У вас не будет свободного места, пока вы не выполнили 2 30 ордера, которые вы не скоро ударите.

Вот результаты convert(x) от 1 до 10:

1:  302841629
2:  571277085
3:   34406173
4:  973930269
5:  437059357
6:  705494813
7:  168623901
8:  906821405
9:  369950493
10: 638385949

Ответ 3

На моем старом месте было следующее:

Идентификатор клиента (который начинался с 1001), последовательность заказа, которую они сделали, и уникальный идентификатор из таблицы Orders. Это дало нам хорошее длинное число не менее 6 цифр, и оно было уникальным из-за двух первичных ключей.

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

Ответ 4

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

Ответ 5

Что-то вроде этого:

  • Получить порядковый номер заказа. Или, может быть, отметка UNIX с двумя или тремя случайными цифрами (при одновременном размещении двух ордеров) тоже хороша.
  • Побитовое-XOR оно с некоторым полусекретным значением, чтобы число отображалось как "псевдослучайное". Это примитивно и не остановит тех, кто действительно хочет исследовать, сколько заказов у ​​вас есть, но для истинной "случайности" вам нужно сохранить (большую) таблицу перестановок. Или вам понадобятся большие случайные числа, поэтому вас не поразит парадокс дня рождения.
  • Добавить checkdigit с помощью алгоритм Verhoeff (я не уверен, что у него будут такие хорошие свойства для base33, но это не должно быть плохо).
  • Преобразуйте число, например, в базу 33 ( "0-9A-Z", за исключением "O", "Q" и "L", которые могут быть ошибочно приняты "0" и "1" ) или что-то еще как это. Простота произнесения означает исключение большего количества букв.
  • Группируйте результат с помощью некоторого визуально читаемого шаблона, например XXX-XXX-XX, поэтому пользователям не придется отслеживать позицию пальцами или указателями мыши.

Ответ 6

Я предпочел бы отправить номер 347 и получить отличное обслуживание клиентов на меньшем персонифицированном веб-сайте, чем: G-84e38wRD-45OM на мега-сайте, и будет проигнорирован в течение недели.

Вы не хотели бы, чтобы это было идентификатором системы или частью ссылки, но в качестве удобного для нее номера.

Ответ 7

Douglas Crockford Base32 Кодирование отлично работает для этого.

http://www.crockford.com/wrmg/base32.html

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

5 персонажей увидят вас через ваши первые ~ 32 миллиона заказов, в то же время выполняя очень хорошо и удовлетворяя большинство этих требований. Тем не менее, это не исключает исключения похожих звуковых символов.

Ответ 8

Последовательно, начиная с 1? Что с этим не так?

(Примечание: этот ответ был дан до того, как OP отредактировал вопрос.)

Ответ 9

Хорошо, как насчет этого?

Последовательно, начиная с некоторого числа (2468) и добавив к нему какое-то другое число, скажите, в какой день месяца был установлен этот порядок.

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

Ответ 10

Только одна идея стиля Рубе Голдберга:

Вы можете создать таблицу со случайным набором чисел, привязанную к случайному периоду времени:

Time Period          Interleaver
next 2 weeks:        442
following 8 days:    142
following 3 weeks:   580

и т.д.... это дает вам неограниченное количество перемежителей и не позволяет никому знать ваш курс заказов, потому что ваши периоды времени могут быть порядка дней, а ваш перемежитель делает много низкоуровневых операций, tech "затирание" для вас.

Вы можете создать эту таблицу один раз и просто убедиться, что все Interleavers уникальны. Вы можете гарантировать, что у вас не закончится Interleavers, просто добавив больше символов в набор или начните с определения более длинных перемежителей.

Таким образом, вы генерируете идентификатор заказа, получая последовательный номер и используя сегодняшнее значение перемежителя, чередуйте его цифры (следовательно, имя) между каждой последовательной цифрой. Гарантированный уникальный - гарантированный путаница.

Пример:

Today I have a sequential number 1, so I will generate the order ID:  4412
The next order will be 4422
The next order will be 4432
The 10th order will be 41402

In two weeks my interleaver will change to 142, 
The 200th order will be 210402
The 201th order will be 210412

Eight days later, my interleaver changes to 580:
The 292th order will be 259820

Это будет совершенно запутанным, но полностью детерминированным. Вы можете просто удалить каждую другую цифру, начиная с 1-го места. (за исключением случаев, когда ваш идентификатор заказа на одну цифру длиннее вашего перемежителя)

Я не сказал, что это лучший способ - только идея пятницы.

Ответ 11

Вы можете сделать это как почтовый индекс: 2b2 b2b

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

Ответ 13

Как получить текущее время в миллисекундах и использовать его в качестве идентификатора заказа?