Was wäre ein gutes Order-ID-Schema für eine E-Commerce-Lösung oder einen kostenpflichtigen Web-Service?

8

Beachten Sie Folgendes:

a) Sie wollen etwas Vertraulichkeit (wie Sie nicht jedem sagen, wie viele Bestellungen Sie erhalten haben).

b) Sie möchten am Ende eine Prüfziffer (z. B. mit dem Verhoeff-Algorithmus), damit Sie Fehlschreibfehler leicht erkennen und Fehler beim Scannen von Barcodes vermeiden können, falls dies der Fall ist.

c) Sie müssen die Zeit berücksichtigen, damit die Verbraucher die Reihenfolge der Bestellungen sortieren können.

d) sollte es alles numerisch oder hexdec sein, usw.?.

e) etwas, das Ihr Kunde dem Support-Team telefonisch mitteilen kann und gerade ausreicht, um die Bestellung zu identifizieren, ohne dass das Personal aus Sicherheitsgründen um E-Mail usw. bitten muss.

Ich würde gerne einige Meinungen hören.

PS: Jeder Algorithmus, der zur Lösung dieses Problems entwickelt wurde, würde auch als eine gültige Antwort für mich angesehen werden.

    
Henrique Vicente 31.10.2010, 04:33
quelle

4 Antworten

5

Hier ist meine Lösung.

Haben Sie eine drei Portion x-y-z, wobei x der Zeitstempel, y der Zufallscode und z die Prüfziffer ist, die durch die Verkettung von x und y erzeugt wird. Aber um es zu vereinfachen (kleiner machen), werden x und y in einer benutzerdefinierten Basis anstelle der numerischen Basis 10 angegeben, aber z wird immer noch an Basis 10 angegeben.

Beispiele für IDs, die Sie mit diesem Ansatz erhalten können:

  • LP9NTX-8D41-QW6R-9
  • LP9NTY-5H3L-BFS7-5
  • LP9NTZ-RWL3-D619-8
  • LP9NVB-BW74-788W-6
  • LP9NVW-G17D-4911-8

Sie können also nach dem Zeitstempel sortieren (beachten Sie, wie es in einer 'inkrementellen alphanumerischen' Reihenfolge verläuft, wenn Sie nicht genau wissen, was eine numerische Basis ist).

Dazu habe ich die Ziffern + Großbuchstaben von base58 (am Ende spielt es keine Rolle, ob ich Klein- oder Großbuchstaben verwende), also Base62 ohne irgendwelche verwirrenden Zeichen. Flickr, bit.ly und andere verwenden base58, um Twitter-freundliche Links und ähnliches zu erstellen .

Das Verhoeff :: calcsum unten ist Verhoeffs Diedergruppe D5 Check von Dahnielson. Die einzige Bearbeitung, die ich mache gemacht wurde, seinen Code in eine Klasse zu setzen, also ist es genauso.

Hier ist ein Code: (* etwas modifiziert von dem, was ich an den Zeilen oben versprochen habe ^)

%Vor%

Kurz nachdem ich mit dem Schreiben fertig war, kam mir ein weiterer möglicherweise schief laufender Sachverhalt in den Sinn. Ich erinnerte mich, dass Sie nicht wollen, dass sich Ihre Kunden beleidigt fühlen. Selbst wenn man denkt, dass schlechte Wörter wie "f? Ck" oder "4ss" schließlich in Ordnung sind (und sie werden es mit ziemlicher Sicherheit tun), sind explizite Wörter (wie beim Ändern der "4" für "a" im vorherigen Wort) definitiv nicht . Aus diesem Grund empfehle ich Ihnen, stattdessen die alternative Basis / Obergrenze zu verwenden:

%Vor%

Bitte beachten Sie, dass Sie, wenn Sie versuchen, größere Zahlen zu verwenden, das obere PHP-Limit sowie das mt_rand-Limit erreichen, das mit mt_getrandmax () gesehen werden kann. Außerdem möchte ich sagen, dass für das, was ich sehe, die Entropie von mt_rand ausreicht.

Wenn Sie größere Zahlen für den zufälligen Teil benötigen, empfehle ich, nur einen dritten Teil mit etwas wie mt_rand (i, j) anzuhängen; Dabei sind i und j die Min- und Max-Werte für deine Basis, die deine Auftrags-ID in $ num-chars length erhöhen (tatsächlich habe ich dies mit der obigen Konfiguration gemacht).

Und auf der DB-Seite ist es ein einzigartiges Feld, um Kollisionen zu vermeiden.

Danke euch allen.

    
Henrique Vicente 01.11.2010 08:55
quelle
1

Wie wäre es mit einer zufälligen Zeichenfolge in welcher Länge auch immer? Verwenden Sie Zeichen, die nicht leicht mit anderen Zeichen verwechselt werden können, um sie über das Telefon zu lesen. Rufen Sie also bei jeder Bestellung etwas an wie:

%Vor%

Das Erraten von 8 Zeichen, die von der obigen Methode zurückgegeben werden, ist eine Chance von 1/282429536481. Und du behältst die Integrität in der db mit einer einzigartigen Einschränkung aufrecht, richtig?

    
JeremyWeir 31.10.2010 05:21
quelle
1

java.util.UUID.randomUUID ()

    
Matt Caldwell 01.11.2010 09:36
quelle
0

Sie könnten eine GUID verwenden. Um es auf eine benutzerfreundliche Zeichenfolge zu verkleinern, wäre es sinnvoll, den Wert über einen Base32 -Konverter zu berechnen, der zu einer Zeichenfolge führen würde enthält 26 Zeichen von AZ und Ziffern 2-7

Um Ihre anderen Kriterien zu erfüllen, können Sie eine Prüfziffer an den GUID-Wert anhängen, und Sie benötigen wahrscheinlich eine separate echte inkrementelle Bestellnummer in der Datenbank, um die Eindeutigkeit zu garantieren und eine natürliche Indexierung / Sortierung zu ermöglichen.

    
PaulG 31.10.2010 12:21
quelle