Generieren eines nicht ganz global eindeutigen Bezeichners

8

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:

harte Anforderungen

  • Die ID darf nur Dezimalstellen enthalten (die zugrunde liegenden Daten sind ein BCD);
  • Die maximale Länge der ID beträgt 12 Zeichen (Ziffern).
  • Muss offline generiert werden - eine Datenbank / Webverbindung ist nicht immer verfügbar!

Weiche Anforderungen

  • Wir möchten, dass es mit dem Kalenderjahr und / oder Monat beginnt. Da dies eine Menge Entropie verschwendet, macht es mir nichts aus, dies zu kompromittieren oder (falls nötig) komplett zu verwerfen.
  • IDs, die von einem bestimmten Computer generiert werden, sollten sequenziell angezeigt werden.
  • IDs müssen nicht nach Maschinen sortiert werden - beispielsweise ist es völlig in Ordnung, wenn Maschine 1 [123000, 124000, 125000] ausspuckt und Maschine 2 spuckt [123500, 123600, 124100].
  • Je länger jedoch im kollektiven Sinne, desto besser. Ein Satz von IDs wie [200912000001, 200912000002, 200912000003, ...] wäre perfekt, obwohl dies offensichtlich nicht auf mehrere Maschinen verteilt ist.

Nutzungsszenario:

  • IDs im Rahmen dieses Schemas werden höchstens aus 10, vielleicht 100 verschiedenen Rechnern generiert.
  • Es werden insgesamt nicht mehr als ein paar Millionen IDs generiert.
  • Nebenläufigkeit ist extrem niedrig. Ein einzelner Computer generiert keine IDs öfter als alle 5 Minuten oder so. Außerdem werden höchstwahrscheinlich nicht mehr als 5 Maschinen gleichzeitig IDs innerhalb derselben Stunde oder sogar am selben Tag erzeugen. Ich erwarte, dass weniger als 100 IDs innerhalb eines Tages auf einer gegebenen Maschine und weniger als 500 für alle Maschinen generiert werden.
  • Eine kleine Anzahl von Maschinen (3-5) würde höchstwahrscheinlich dafür verantwortlich sein, mehr als 80% der IDs zu generieren.

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.

    
Aaronaught 23.12.2009, 16:23
quelle

10 Antworten

3

Wie wäre es mit yyMMddhhmmID ?

%Vor%

Beispiel: 0912113201 von Maschine mit ID = 01 .

Alternativ (wenn Sie keine zweistelligen Jahre mögen (Y2K lol)), wie wäre es mit yyyyMMIDxxxx ?

%Vor%

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%     
jason 23.12.2009, 16:32
quelle
4
  

"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 ...

  • Position 1-3: 999 Maschinen
  • Position 4-12: Laufende Nummern

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)

    
Great Turtle 23.12.2009 16:55
quelle
3

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.

    
anon 23.12.2009 16:30
quelle
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.

    
Mac 24.12.2009 00:50
quelle
0

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 .

    
Pete Kirkham 23.12.2009 16:35
quelle
0

Idee Nummer eins:

YYMMDDmmnnnn

wo

%Vor%

~~

Idee Nummer zwei:

mmmmnnnnnnnn

Wo

%Vor%     
David Oneill 23.12.2009 16:35
quelle
0

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.

    
Poindexter 23.12.2009 16:36
quelle
0

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.

    
tvanfosson 23.12.2009 16:37
quelle
0

"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.

    
symcbean 23.12.2009 17:24
quelle
-1

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.

    
theorifice 14.05.2014 01:54
quelle