Ich hatte eine Anforderung, wo mehrere Instanzen einer Konsolenanwendung benötigt, um eine eindeutige Ganzzahl-ID zu erhalten. Es wird verwendet, um die Instanz zu identifizieren und beim Start zugewiesen. Da die .exe von Hand gestartet wird, habe ich eine Lösung mit den Ticks der Startzeit festgelegt.
Meine Argumentation war, dass es für den Benutzer fast unmöglich wäre, zwei .exe in derselben Millisekunde zu starten. Dieses Verhalten ist deterministisch: Wenn Sie eine Kollision haben, wissen Sie, dass das Problem darin bestand, dass zwei Instanzen gleichzeitig gestartet wurden. Je nach Hashcode, GUID oder Zufallszahlen können Methoden auf unvorhersehbare Weise fehlschlagen.
Ich setze das Datum auf 0001-01-01, addiere die aktuelle Zeit und teile die Ticks durch 10000 (weil ich die Mikrosekunden nicht einstelle), um eine Zahl zu erhalten, die klein genug ist, um in eine ganze Zahl zu passen.
var now = DateTime.Now;
var zeroDate = DateTime.MinValue.AddHours(now.Hour).AddMinutes(now.Minute).AddSeconds(now.Second).AddMilliseconds(now.Millisecond);
int uniqueId = (int)(zeroDate.Ticks/10000);
EDIT: Es gibt einige Vorbehalte. Um Kollisionen unwahrscheinlich, stellen Sie sicher, dass:
- Die Instanzen werden manuell gestartet (mehr als eine Millisekunde auseinander)
- Die ID wird erzeugt einmal pro Instanz, beim Start
- Die ID muss nur einmalig sein in Bezug auf andere Instanzen, die derzeit ausgeführt werden
- Nur eine kleine Anzahl von IDs jemals
Warum nicht einfach die GUIDs für Sie die 32-Bit-Integer mit würden welchen Zweck auch immer verwenden, benötigt? – JAB
Einzigartig über welche Domain? Ich habe gerade ein Programm geschrieben und ausgeführt, das * alle * 32-Bit-Ganzzahlen erzeugt, so dass Sie nicht in der Lage sein werden, eine zu erzeugen, die ich noch nicht habe! –
Wenn Sie 'Guid' vergessen können, dann ist der beste Weg," unique "(100%) zu erhalten, nur eine int Variable irgendwo zu haben und int ++ zu tun. Sie sind sicher, 2^32 eindeutige Werte zu bekommen, und das ist ziemlich großer Raum auch. – nawfal