Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ID für lokale Anwendung, die für mehrere Installationen eindeutig sein muss
temilun
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

ID für lokale Anwendung, die für mehrere Installationen eindeutig sein muss

beantworten | zitieren | melden

Hallo,

ich bin Hobbyprogrammierer und habe folgendes Problem:

Die Software ist auf mehreren Rechner installiert und speichert ihre Daten jeweils in einer lokalen DB ab. Ein Server ist (zumindest derzeit nicht verfügbar), allerdings muss es möglich sein die Daten zwischen den verschiedenen Installationen synchronisieren zu können.

Insofern wäre eine GUID als Schlüssel für die DB die erste Wahl, allerdings möchte ich auch ein Barcodelabel für jeden "Artikel" drucken und dazu ist eine GUID einfach zu lang. Der Barcode sollte also maximal 16 Zeichen lang sein. Idealerweise soll natürlich die ID gleich dem Barcode sein, weil dieser ja auch eindeutig sein muss.

Meine Idee dazu ist jetzt eine zusammengesetzte ID zu generieren:

1. Eine ID, die irgendwie dem Rechner zugeordnet ist, auf dem die Software installiert ist (z.B. die Festplatten-ID, bzw. ein Teil davon oder ein Hash davon)
2. Ein 32-Bit-Hash aus einer GUID.

Kollisionen des 2. Teils könnte ich so auf dem jeweiligen Rechner behandeln und durch den 1. Teil wäre sicher gestellt, dass die ID auch im Gesamtsystem eindeutig bleibt.

Mit zwei 32-Bit-Hashes käme ich damit auf eine ID/Barcode mit einer Gesamtlänge von 16 Zeichen.

Was ist von dieser Idee zu halten, bzw. hat jemand einen besseren Ansatz?
private Nachricht | Beiträge des Benutzers
Ahrimaan
myCSharp.de - Member



Dabei seit:
Beiträge: 350
Herkunft: Thorn

beantworten | zitieren | melden

Wir haben für diesen Zweck die Seriennummer der Festplatte genutzt.

Klappt bei 900 Rechnern wunderbar :-)

Grüße
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo temilun,

pragmatischste Variante: Den User bei der Installation was eingeben lassen. Dann sind Kollisionen bei verantwortungsvollen Usern ausgeschlossen

Das ließe sich auch automatisieren, dass die erste Installation einen Stick "vorbereitet", der dann bei jedem weiteren Rechner einmalig eingesteckt werden muss. Dort würde dann im einfachsten Fall einfach eine Id hochgezählt.
Evtl. ließe sich das auch via Netzwerk vereinfachen.

Ansonsten evtl. auch Macadresse - auf dieser basiert ja auch die GUID Erzeugung.

Zu deiner ID-Erzeugung: Wenn der erste Teil je Rechner eindeutig ist, kannst du ja auch einfach hochzählen - einen Hash über eine GUID halte ich da eher nicht für nötig.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo temilun,

über wieviele Installationen reden wir? Einige wenige, zig, hunderte, tausende, zehntausende oder mehr?

herbivore
private Nachricht | Beiträge des Benutzers
temilun
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

@herbivore

Wir reden von deutlich unter 100 Installationen, vielleicht an die 20.

@winsharp93

Ich möchte umständlichen Installationsschnickschnack möglichst vermeiden. Dazu zähle ich Sticks, Netzwerkanmeldungen vor der ersten Nutzung usw.

Darum habe ich auch die Idee verworfen bei der Installation eine Art SystemId einzugeben / anzulegen verworfen. Obwohl ich mir grad gut vorstellen kann, einfach beim ersten Start eine GUID zu erzeugen und in einer .config abzulegen (oder auch in der Datenbank).

Natürlich könnte ich einfach hochzählen, aber dazu müsste ich irgendwo eine Variable haben, die ich mit jedem Anlegen einer Id hochzählen kann. Da kommt mir das Hashen einer GUID irgendwie einfacher.

Ach ja, ich habe jetzt auch damit etwas herumexperimentiert und mit dem MurMurHash (32bit) käme ich auch mit der Gesamtlänge der Id (als druckbarer String) hin. Da bin ich gerade bei 12 Zeichen, wenn ich nämlich von der "SystemId" (der erste Teil) nur 16 Bit verwende.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo temilun,
Zitat
Wir reden von deutlich unter 100 Installationen, vielleicht an die 20.
ok, dann ist die Wahrscheinlichkeit eines Clashes selbst bei nur 32bit immer noch ausreichend gering. Bei tausenden, erst recht bei zehntausenden Installationen steigt die Wahrscheinlichkeit wegen des Geburtstagsparadoxons (selbst bei optimaler Gleichverteilung des Zufallsgenerators) allerdings schnell und spürbar auf Werte, die einem nicht mehr ganz egal sein können.
Zitat
Natürlich könnte ich einfach hochzählen, aber dazu müsste ich irgendwo eine Variable haben, die ich mit jedem Anlegen einer Id hochzählen kann.
Wie wird denn dein Programm ausgeliefert? Es wäre nun auch keine unüberwindbare Hürde, ein kleines php-Script für einen Web-Server zu schreiben, der erst beim Download ein ZIP-File erstellt, in dem eine Datei die passende (hochgezählte) Id enthält.

herbivore
private Nachricht | Beiträge des Benutzers
temilun
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

"Ausliefern" ist vielleicht etwas hochtrabend formuliert. Ich dachte ich kopiere es einfach auf einen USB-Stick und installiere es von da aus.

Ok. Ich hab in der Zwischenzeit mal etwas mit meinem Ansatz herumgespielt und u.a. auch mal ein paar hunderttausend Id's erzeugt. Das scheint recht gut zu funktionieren und ergibt am Ende einen Barcode von 12 Zeichen, der mit Code128 ganz gut auf einem Etikett Platz hat.

Hat vielleicht noch jemand einen Code, um an die Seriennummer der Festplatte zu kommen? Ich verwende jetzt "GetVolumeSerial" aus der kernel32.dll. Nachdem was ich im web gefunden habe ist das aber wohl nicht die Hardware-Seriennummer. Ansonsten wird immer auf WMI hingewiesen, was mir nicht so gefällt, weil ich was möglichst allgemeingültiges haben möchte.

Naja, mit der derzeitigen Lösung funktioniert es vermutlich auch ausreichend gut.

Danke,
temi
private Nachricht | Beiträge des Benutzers