2009-07-24 4 views
14

Jede Bestellung in meinem Online-Shop hat eine benutzerbezogene Bestellnummer. Ich frage mich, wie ich sie am besten erzeugen kann. Kriterien sind:Der beste Weg, um Bestellnummern für einen Online-Shop zu generieren?

  • Short
  • einfach über das Telefon zu sagen (zB "m" und "n" nicht eindeutig sind)
  • Einzigartige
  • Checksum
  • (Overkill Nützlich?) edit: hat nicht verraten, wie viele Gesamtaufträge gab es (ein Kunde könnte es irritierend Ihre 3. Ordnung zu machen)

Rig ht jetzt bin ich mit dem folgenden Verfahren (keine Prüfsumme):

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 
+0

Das wäre für eine Weile in Ordnung, aber nachdem du eine Menge (eine wahre, wahre Menge) an Befehlen hast, werden die Chancen, eine eindeutige ID zu generieren, immer geringer ... Ich denke, ich werde dir eine Antwort schicken out ... – nilamo

+0

der Kunde könnte nur denken, die Bestellnummern sind einzigartig für ihn/sie, so würde ich nicht darüber besorgt sein. Das ist eine dumme Sache, sich um IMO zu kümmern. – Tim

Antwort

13

Als Kunde würde ich gerne mit:

year-month-day/short_uid 

zum Beispiel:

2009-07-27/KT1E 

Es gibt Raum für etwa 33^4 ~ 1mln Bestellungen pro Tag. Hier

+4

Jahr ohne Trapping "2", Tag des Jahres und 4 zufällige Zeichen (z. B. 9-256-KT1E) das ist genug für 1 Million Bestellungen jeden Tag für 999 Jahre, wie? – Chris

+2

Das ist ein wirklich guter Weg, es zu tun, sowie die Bestellnummer für das Kaufdatum innerhalb der ID selbst zu scannen. Ich würde mich entscheiden, ein wenig obskurer zu sein, ein bisschen mehr wie ein Handelscode, und die Token fallen lassen, nur: 20090727KT1E. – axiom82

+0

Gibt nur Platz für eine Bestellung pro Kunde pro Tag, obwohl – Phil

0

Sequenziell beginnend bei 1? Was stimmt damit nicht?

. (Anmerkung: Diese Antwort gegeben wurde, bevor die OP die Frage bearbeitet)

+0

Siehe meine Bearbeitung - Ich möchte nicht meinen Kunden zeigen, wie neu mein Geschäft ist. –

+0

Sequenziell ab 1234? ;) – John

+0

Kunden oder, was noch wichtiger ist, die Konkurrenz kann sehen, wie Ihre Verarbeitung über einen bestimmten Zeitraum hinweg bestellt werden kann. – FlappySocks

2

Bei meinem alten Platz, es war die folgende:

Die Kunden-ID (das in 1001 gestartet), wobei die Reihenfolge der bestellen sie dann die eindeutige ID aus der Orders-Tabelle. Das gab uns eine schöne lange Zahl von mindestens 6 Ziffern und es war einzigartig wegen der zwei Primärschlüssel.

Ich nehme an, wenn Sie Striche oder Leerzeichen in Sie setzen, könnten Sie uns sogar einen kleinen Einblick in die Kaufgewohnheiten des Kunden geben. Es ist nicht schlimm, sicher zu sein, und ich schätze, eine Bestellnummer wäre wahrscheinlich, aber ich bin mir nicht sicher, ob ein Sicherheitsrisiko besteht oder nicht.

0

Ok, wie wäre es mit diesem?

Sequentiell beginnend mit einer Nummer (2468) und fügen Sie eine andere Zahl hinzu, sagen Sie den Tag des Monats, an dem die Bestellung aufgegeben wurde.

Die Zahl erhöht sich immer (bis Sie die Kapazität des Integer-Typs überschreiten, aber bis dahin ist es Ihnen wahrscheinlich egal, da Sie unglaublich erfolgreich sein werden und Margaritas in einem weit entfernten Inselparadies schlürfen). Es ist einfach genug, um es zu implementieren, und es mischt Dinge genug, um jedes Raten, wie viele Bestellungen Sie haben, abzuschütteln.

1

Etwas wie folgt aus:

  1. Get sequenziellen Auftragsnummer. Oder, vielleicht, ein UNIX-Zeitstempel plus zwei oder drei zufällige Ziffern (wenn zwei Aufträge im selben Moment platziert werden) ist auch in Ordnung.
  2. Bitwise-XOR es mit einigen halb-geheimen Wert, um die Zahl erscheinen "Pseudo-Random". Dies ist primitiv und wird nicht diejenigen aufhalten, die wirklich untersuchen wollen, wie viele Befehle Sie haben, aber für true "Zufälligkeit" müssen Sie eine (große) Permutationstabelle behalten. Oder Sie müssen große Zufallszahlen haben, so dass Sie nicht durch das Geburtstagsparadox getroffen werden.
  3. Hinzufügen checkdigit mit Verhoeff algorithm (ich bin nicht sicher, dass es so gute Eigenschaften für base33 haben wird, aber es sollte nicht schlecht sein).
  4. Konvertieren Sie die Nummer in - zum Beispiel - Basis 33 ("0-9A-Z", außer für "O", "Q" und "L", die mit "0" und "1" verwechselt werden können) oder etwas so wie das.Leichtigkeit der Aussprache bedeutet, mehr Buchstaben auszuschließen.
  5. Gruppieren Sie das Ergebnis in einem visuell lesbaren Muster wie XXX-XXX-XX, damit Benutzer die Position nicht mit ihren Fingern oder Mauszeigern verfolgen müssen.
-2

Wie wäre es, die aktuelle Zeit in Millisekunden zu erhalten und diese als Ihre Auftrags-ID zu verwenden?

0

Nur eine Rube Goldberg-Stil Idee:

Sie können eine Tabelle mit einem zufälligen Satz von Zahlen erzeugen, die zu einer zufälligen Zeit gebunden ist:

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

und so weiter ... Dies gibt Ihnen eine unbegrenzte Anzahl von Interleavers und lässt niemanden Ihre Auftragsrate wissen, da Ihre Zeiträume in der Größenordnung von Tagen liegen können und Ihr Interleaver eine Menge Low-Tech "Maischen" für Sie durchführt.

Sie können diese Tabelle einmal generieren und einfach alle Interleaver einzigartig sind. Sie können sicherstellen, dass Ihnen Interleavers nicht ausgehen, indem Sie einfach weitere Zeichen in das Set einfügen oder indem Sie längere Interleavers definieren.

So erzeugen Sie eine ID, um durch eine laufende Nummer bekommen, und Interleaver Wert mit heute, verschachteln seine Ziffern (daher der Name) zwischen den einzelnen Ziffern der fortlaufenden Nummer. Garantiert einzigartig - garantiert verwirrend.

Beispiel:

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 

Dies wird völlig verwirrend sein, aber vollständig deterministisch. Sie können einfach jede zweite Ziffer entfernen, die an der Stelle der 1 beginnt. (außer wenn Ihre Bestell-ID nur eine Ziffer länger als Ihr Interleaver ist)

Ich habe nicht gesagt, das war der beste Weg - nur eine Idee Freitag.

1

Ich würde eher die Nummer 347 einreichen und guten Kundenservice auf einer kleineren sympathischen Website als: G-84e38wRD-45OM auf der Mega-Website und für eine Woche ignoriert werden.

Sie möchten dies nicht als System-ID oder Teil eines Links, aber als eine benutzerfreundliche Nummer funktioniert es.

3

ist eine Implementierung für ein System I proposed in an earlier question:

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 

Es ist nur eine billige Hash-Funktion, aber es macht es schwierig für einen durchschnittlichen Benutzer, um zu bestimmen, wie viele Aufträge verarbeitet wurde, oder eine Zahl für eine andere Reihenfolge. Es wird nicht der Platz ausgehen, bis Sie 2 Aufträge abgeschlossen haben, die Sie nicht bald treffen werden.

Hier sind die Ergebnisse von convert(x) für 1 bis 10:

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

Sie es wie eine Postleitzahl tun könnten: 2b2 b2b

diese Weise ist es eine Art von Prüfsumme (nicht wirklich, aber zumindest weißt du, dass es falsch ist, wenn es 2 aufeinanderfolgende Zahlen oder Buchstaben gibt). Es ist einfach, über das Telefon zu lesen, und es gibt keinen Hinweis darauf, wie viele Bestellungen im System sind.

2

Anstatt Erzeugen und Speichern einer Nummer, können Sie eine verschlüsselte Version versuchen zu schaffen, die nicht die Anzahl der Aufträge im System offenbaren würde. Here's an article auf genau das.

+0

Obfuscate Integer-IDs, wie sie in dem von Ihnen geposteten Link angezeigt werden, werden immer noch als sicher und in Ordnung für die Verwendung angesehen. – user2049132

1

Douglas Crockfords Base32 Encoding funktioniert hervorragend dafür.

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

Speichern Sie die ID selbst in Ihrer Datenbank als Auto aufsteigende Integer, bei etwas Ausgangs entsprechend groß wie 100000, und einfach den codierten Wert an den Kunden/Schnittstelle aus.

5 Zeichen werden Sie durch Ihre ersten ~ 32 Millionen Bestellungen sehen, während sie sehr gut funktionieren und die meisten dieser Anforderungen erfüllen. Es erlaubt jedoch nicht, ähnlich klingende Charaktere auszuschließen.