Ich habe eine Reihe verschiedener Fragen zum Erzeugen von UIDs gefunden, aber soweit ich das beurteilen kann, sind meine Anforderungen hier etwas einzigartig (ha).
Zusammenfassend: Ich muss eine sehr kurze ID generieren, die "lokal" eindeutig ist, aber nicht "global" oder "universell" eindeutig sein muss. Die Einschränkungen basieren nicht einfach auf ästhetischen oder räumlichen Bedenken, sondern darauf, dass dies im Wesentlichen als Hardware-Tag verwendet wird und dies den Beschränkungen der Hardware unterliegt. Hier sind die Spezifikationen:
Ich weiß, dass es möglich ist, einen Zeitstempel mit weniger als 12 Dezimalziffern auf eine Genauigkeit von 100 ms oder sogar 10 ms zu codieren, was mehr als genug ist, um eine "eindeutig genug" ID für diese Anwendung zu garantieren. Der Grund, warum ich dies hier auf SO verlange, ist, weil ich wirklich gerne versuchen würde, das Jahr / den Monat lesbar zu machen oder eine Information über die Quellmaschine oder beides zu kodieren.
Ich hoffe, dass jemand mit einem Kompromiss bei diesen weichen Anforderungen helfen kann ... oder erklären, warum keiner von ihnen angesichts der anderen Anforderungen möglich ist.
(P.S. Meine "Muttersprache" ist C # aber Code in jeder Sprache oder sogar Pseudocode ist in Ordnung, wenn jemand brillante Ideen hat.)
Aktualisierung:
Nun, da ich die Möglichkeit hatte, darauf zu schlafen, denke ich, dass ich eine Timestamp-Codierung standardmäßig verwenden werde und einzelnen Installationen erlauben soll, zu einer maschinensequentiellen ID zu wechseln, indem Sie ihre eigenen definieren 2- oder 3-stellige Maschinen-ID. Auf diese Weise können Kunden, die sich mit der ID verarschen und menschenlesbare Informationen einpacken möchten, ihre eigene Methode zur Sicherstellung der Eindeutigkeit aussortieren, und wir sind nicht verantwortlich für Missbrauch. Vielleicht helfen wir Ihnen, indem Sie ein Server-Dienstprogramm zur Verfügung stellen, um Rechner-IDs zu behandeln, wenn sie alle Online-Installationen durchführen.
Wie wäre es mit yyMMddhhmmID
?
Beispiel: 0912113201
von Maschine mit ID = 01
.
Alternativ (wenn Sie keine zweistelligen Jahre mögen (Y2K lol)), wie wäre es mit yyyyMMIDxxxx
?
Beispiel: 200912010001
von Maschine mit ID = 01
.
Wie Sie bereits gesagt haben, dass jede Maschine nur alle fünf Minuten einen Bezeichner generiert, haben Sie pro Monat 8.928 (24 * 31 * 60/5 = 8928) Bezeichner, die in xxxx
passen. Hier könnten Sie das Jahr auf ein dreistelliges Jahr yyy
(z. B. 009) herunterdrücken, wenn Sie eine zusätzliche Ziffer in der Sequenz xxxx
oder der Maschinen-ID benötigen.
Diese passen Zeitstempel / Rechner-ID wie gewünscht an.
Wir alle mögen konkreten Code:
%Vor%Ausgaben:
%Vor%"Der Grund, warum ich das hier frage SO, weil ich es wirklich gerne würde versuchen Sie es entweder einzubauen lesbares Jahr / Monat dort oder kodieren Sie einige Informationen über die Quellmaschine oder beides. "
Lassen Sie mich zunächst damit beginnen, dass ich mich schon einmal damit beschäftigt habe und der Versuch, nützliche Informationen in einer Seriennummer zu speichern, ist eine langwierige Idee. Eine Seriennummer des Geräts sollte bedeutungslos sein. Genauso wie der Primärschlüssel eines Datenbankeintrags bedeutungslos sein sollte.
In der Sekunde, in der Sie versuchen, echte Daten in Ihre Seriennummer einzugeben, haben Sie BUSINESS LOGIC einfach hineingeworfen, und Sie werden gezwungen sein, es wie jedes andere Stück Code zu pflegen. Zukunft wirst du über dich hassen. Vertrau mir darauf. ; o)
Wenn Sie versuchen, Datums- / Uhrzeitwerte zu speichern, verschwenden Sie numerischen Speicherplatz mit ungültigen Zeitangaben. Zum Beispiel wirst du nie mehr als 12 im Monat Feld haben.
Ein gerader Epochen- / Einheitszeit-Zähler wäre besser, aber für eine Maschine, die nur wenige IDs pro Minute erzeugt, verschwenden Sie immer noch viel Platz.
12 Ziffern sind nicht viel Platz. Sehen Sie sich die VIN-Seite auf Wikipedia an. Platz für nur wenige Hersteller, nur ein paar tausend Autos. Sie verwenden jetzt VINs wieder, weil sie keinen Platz mehr haben, indem sie Bedeutung hinein packen.
Das soll nicht heißen, dass ALLE Bedeutungen in einer Seriennummer schlecht sind, halten Sie sie streng begrenzt, um sicherzustellen, dass die Zahlen nicht kollidieren.
So etwas ...
Das ist ALL , um Kollisionen zu vermeiden. Wenn Sie eine Ortsziffer hinzufügen, dann sind Sie bei 11 Standorten verschraubt.
Tut mir leid, wenn sich das wie ein Schwindel anhört. Ich beschäftige mich mit dieser viel Herstellungselektronik und verschiedenen bearbeiteten Teilen. Es war nie lange auf lange Sicht zu Ende, es sei denn, es ist sehr viel Speicherplatz verfügbar, oder ein sekundäres Tag (welches - wie bereits erwähnt - den notwendigen ID-Platz bietet)
Wenn Sie Ihre Software installieren, installieren Sie auch einen machiine ID-Datei / Registrierungsschlüssel, der eine eindeutige numerische ID enthält. Da Sie nur wenige Maschinen haben, sollte dies nicht mehr als 3 oder 4 Ziffern dauern. Verwenden Sie diese als MS-Ziffern. Erzeugen Sie die verbleibenden Ziffern nacheinander beginnend bei 1.
Ich sammle Sie für Windows zu entwickeln (re: Ihr Kommentar über "MSI / EXE" als Antwort auf Jasons Antwort). Als solches könnten Sie WMI oder ähnliches erhalten, um ein eindeutiges Hardware-Attribut (Prozessor- oder HDD-Seriennummer oder NIC-MAC-Adresse zum Beispiel) zu erhalten, um eine eindeutige Maschinen-ID zu erstellen. Eine Alternative könnte auch die Verwendung der eindeutigen Seriennummer der Hardware sein, die Sie selbst entwickeln (falls vorhanden).
Das wäre wahrscheinlich länger als Sie brauchen, also könnten Sie es möglicherweise abschneiden oder hashen, um es auf (sagen wir) 16 Bits oder so zu reduzieren und das als Ihre Maschinen-ID zu verwenden. Offensichtlich kann dies zu Kollisionen führen, aber die geringe Anzahl von Maschinen (~ 100) bedeutet, dass dies unwahrscheinlich ist, und die Verwendung der abgeschnittenen Ausgabe eines kryptografischen Hashs (etwa MD5) macht dies noch weniger.
Da Sie eine (höchstwahrscheinlich eindeutige) Maschinen-ID haben, können Sie dann im Wesentlichen eindeutige IDs mithilfe der in den anderen Antworten aufgelisteten Vorgehensweisen generieren.
Es gibt 864000 100ms Ticks innerhalb von 24 Stunden, also könnte das an einem Datum funktionieren 09.12.24.86400.0, aber Sie müssen das Jahrhundert verlieren, um in 12 Ziffern zu passen, und Sie haben keinen Platz für Maschinen-IDs .
Idee Nummer eins:
YYMMDDmmnnnn
wo
%Vor%~~
Idee Nummer zwei:
mmmmnnnnnnnn
Wo
%Vor%Mein Vorschlag wäre, mehrere Ansätze in einer einzigen ID zu kombinieren. Beispiel: Beginnen Sie mit den Zweijahresziffern, den Zweimonatsziffern und generieren Sie dann eine Zufallszahl mit der Zeit als Startwert für die nächsten Ziffern und dann eine eindeutige Maschinen-ID für das letzte Paar. Oder so ähnlich.
Jede Maschine erhält eine Start-ID von DDNNN, wobei DD eine eindeutige Maschinen-ID ist und NNN die aktuelle Kennung ist, die an diesem Tag von dieser Maschine generiert wurde. Jede Maschine verfolgt die IDs, die sie an einem bestimmten Datum erzeugt hat, und weist die nächste ID zu, wenn sie eine neue benötigt, indem sie die letzte um 1 erhöht. Sie setzt ihren Zähler zu Beginn jedes Tages auf 0 zurück. Das Datum YYYYDOY wird der von jeder Maschine generierten Nummer vorangestellt (4-stelliges Jahr, 3-stelliges Jahr). Die Nummer ist garantiert eindeutig, da die Maschinenkennung eindeutig ist.
Wenn Sie mehr Platz für mehr Maschinen benötigen, können Sie das Jahrtausend aus dem Jahr löschen und eine Ziffer für die Maschinen-ID hinzufügen: YYYDOYDDDNNN.
"Ein einzelner Rechner generiert keine IDs öfter als alle 5 Minuten oder so"
Angenommen, dies ist wahr, dann verwenden Sie einfach den Zeitstempel. (32-Bit-Unix-Zeit hat 10 Dezimalstellen, läuft aber 2038 aus)
Aber ich denke, es ist ziemlich optimistisch anzunehmen, dass es keine Kollision geben wird.
"Von einem bestimmten Computer generierte IDs sollten sequenziell angezeigt werden."
Dann ist Ihre einzige Option, eine Sequenznummer zu verwenden.
Was scheint nicht wirklich zu stimmen, was Sie in späteren Einschränkungen sagen?
Verketten Sie eine aufgefüllte Version der Knoten-ID, um eindeutige Werte über den Cluster zu erhalten.
Verwenden Sie die MAC-Adresse des Geräts als MASCHINEN-ID. Sie können dies verwenden, um Ihren Zeitstempel zu codieren, d. H. Über XOR, oder Sie können ihn an den generierten serialisierten Code anhängen / vorgeben.
Tags und Links algorithm language-agnostic unique uniqueidentifier