So wie ich es mag, GUIDs als eindeutige Kennungen in meinem System zu verwenden, ist es nicht sehr benutzerfreundlich für Felder wie eine Bestellnummer, wo ein Kunde diese möglicherweise zu einem Kundendienstmitarbeiter wiederholen muss.
Was ist ein guter Algorithmus, der verwendet wird, um eine Bestellnummer zu erzeugen, so dass sie lautet:
UPDATE (12/05/2009) Nachdem wir jede der Antworten sorgfältig geprüft hatten, entschieden wir uns, eine 9-stellige Nummer in der mittleren Stufe zu randomisieren, um sie in der Datenbank zu speichern. Im Falle einer Kollision werden wir eine neue Nummer neu generieren.
Wenn die mittlere Schicht nicht überprüfen kann, welche "Bestellnummern" bereits in der Datenbank vorhanden sind, ist das Beste, was sie tun kann, das Erzeugen einer Zufallszahl. Wenn Sie jedoch eine Zufallszahl generieren, die auf weniger als 1 Milliarde beschränkt ist, sollten Sie sich Sorgen um zufällige Kollisionen um sqrt(1 billion)
machen, d. H. Nach einigen zehntausend auf diese Weise generierten Einträgen ist das Risiko von Kollisionen erheblich. Was wäre, wenn die Bestellnummer sequentiell ist, aber in einer verschleierten Art und Weise, d. H. Das nächste Vielfache einer großen Primzahl Modulo 1 Milliarde - würde das Ihren Anforderungen entsprechen?
& lt; Moan & gt; OK klingt wie ein klassischer Fall einer vorzeitigen Optimierung. Du stellst dir ein Performance - Problem vor (Oh mein Gott, ich muss auf die Horror - Datenbank zugreifen, um eine Bestellnummer zu erhalten! Das mag langsam sein) und lande mit einem Haufen pseudo - zufälliger Generatoren und einer Tonne doppeltem Code ; / stöhnen & gt;
Eine einfache praktische Antwort besteht darin, eine Sequenz pro Kunde auszuführen. Die tatsächliche Bestellnummer ist eine Kombination aus Kundennummer und Bestellnummer. Sie können einfach die letzte Sequenz abrufen, wenn Sie andere Dinge über Ihren Kunden abrufen.
Eine einfache Option ist die Verwendung von Datum und Uhrzeit, z. 0912012359, und wenn zwei Aufträge in der gleichen Minute empfangen werden, erhöhen Sie einfach die zweite Reihenfolge um eine Minute (es spielt keine Rolle, wenn die Zeit abgelaufen ist, es ist nur eine Bestellnummer).
Wenn das Datum nicht sichtbar sein soll, berechnen Sie es als die Anzahl der Minuten seit einem festen Zeitpunkt, z. wenn du angefangen hast, Befehle oder ein anderes beliebiges Datum anzunehmen. Wiederum mit der doppelten Prüfung / Inkrementierung.
Ihre Mitbewerber werden davon nichts erfahren, und es ist einfach zu implementieren.
Vielleicht könnten Sie versuchen, einen eindeutigen Text mit einer Markov-Kette zu erzeugen - siehe hier für eine Beispielimplementierung in Python. Vielleicht verwenden Sie sequentielle Zahlen (anstatt zufällige), um die Kette zu generieren, so dass (hoffentlich) jede Bestellnummer eindeutig ist.
Aber nur eine Warnung - siehe hier für das, was passieren kann, wenn Sie nicht t vorsichtig mit Ihren Einstellungen.
Eine Lösung wäre, den Hash eines Felds der Bestellung zu übernehmen. Dies garantiert nicht, dass es aus den Bestellnummern aller anderen Bestellungen eindeutig ist, aber die Wahrscheinlichkeit einer Kollision ist sehr gering. Ich könnte mir vorstellen, dass es ohne "eine Rundreise in die Datenbank" schwierig wäre, sicherzustellen, dass die Bestellnummer eindeutig ist.
Falls Sie mit Hash-Funktionen nicht vertraut sind, ist die Wikipedia-Seite ziemlich gut.
Sie könnten base64 eine Guid codieren. Dies erfüllt alle Ihre Kriterien mit Ausnahme der Anforderung "Nur numerische Werte".
Wirklich, aber die richtige Sache, die hier zu tun ist, lässt die Datenbank die Bestellnummer generieren. Das kann bedeuten, dass ein Template -Eintrag erstellt wird, der nicht wirklich eine Bestellnummer hat, bis der Benutzer ihn speichert, oder möglicherweise die Möglichkeit hinzufügt, leer zu erstellen (aber vielleicht nicht committed) Bestellungen.
Ihre 10-stellige Anforderung ist eine große Einschränkung. Betrachten Sie einen zweistufigen Ansatz.
Sie haben mehrere Treffer auf den Hash-Wert. Aber nicht so viele. Die Kundendienstmitarbeiter werden sehr leicht in der Lage sein, basierend auf zusätzlichen Informationen des Kunden herauszufinden, welche Bestellung in Frage steht.
Die einfache Antwort auf die meisten Ihrer Aufzählungspunkte:
Machen Sie die ersten sechs Ziffern zu einem sequentiell ansteigenden Feld und fügen Sie drei Ziffern des Hashs an das Ende an. Oder sieben und zwei oder acht und eins, abhängig davon, wie viele Befehle du dir vorstellen willst.
Sie müssen jedoch immer noch eine Funktion am Backend aufrufen, um eine neue Bestellnummer zu reservieren. andernfalls ist es unmöglich, eine Nicht-Kollision zu garantieren, da es so wenige Ziffern gibt.
Wir machen TTT-Europa-1-N1.