Der österreichische elektronische Personalausweis stützt sich auf die sogenannten Branchenkennungen. Zum Beispiel kann ein Krankenhaus eine Person identifizieren, indem es eine Sektor-ID für diese Person erhält, die ungefähr wie folgt berechnet wird:
sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant
Ist das eine gute Idee? Ich denke, die Möglichkeit einer noch so kleinen Kollision birgt ein Risiko.
In Hashtabellen haben Sie bei einer Kollision andere Möglichkeiten, die Gleichheit herzustellen, aber mit Primärschlüsseln können Sie möglicherweise nicht zwei identische Schlüssel haben. Dies kann durch einen zusammengesetzten Schlüssel umgangen werden, aber dann geht der Punkt einer eindeutigen Sektor-ID verloren.
Ist es in Ordnung, das zu tun, und gibt es eine gute Möglichkeit, es so zu haben, ohne dass es irgendwann kaputt geht?
personalId
+sectorID
wird bereits als eindeutige Kennung dienen, und da sich dort nichts wie ein Passwort befindet, das versteckt werden muss, scheint Hashing keinen wirklichen Nutzen zu haben. Was vermisse ich? Oder ist die "personID" etwas Geheimnisvolles?Antworten:
In diesem früheren SO-Artikel erfahren Sie, wie Sie die Kollisionswahrscheinlichkeit berechnen. Für SHA-1 beträgt b 160. Die Zahl der in Österreich lebenden Menschen liegt unter 10 Millionen. Selbst wenn jede lebende Person in Österreich in einem Krankenhaus mit einer eindeutigen Personen- / Sektor-ID registriert ist, ergibt sich eine Kollisionswahrscheinlichkeit von weniger als
3.5 x 10^-35
. Ich denke, das sollte für die meisten praktischen Zwecke klein genug sein.quelle
Hashes kollidieren unweigerlich, wenn sie kleiner als alle möglichen Datenkombinationen sind.
Siehe diese hervorragende Antwort: https://softwareengineering.stackexchange.com/a/145633
Wenn Primärschlüssel nicht aussagekräftig sein sollen (lesbar für Menschen; mit abrufbaren Datenmerkmalen), würde ich einfach GUIDs verwenden.
Ja, theoretisch können sie auch kollidieren, aber der Hitzetod des Universums wird wahrscheinlich zuerst eintreten. Siehe https://stackoverflow.com/a/184897
BEARBEITEN: Adressierung der Kontrapunkte von @ DocBrown, um die Dinge zu klären (und um lange Diskussionen in Kommentaren zu vermeiden)
Das Generieren der Kennung aus der Personen- oder Sektor-ID war nicht die Anforderung von OP (tatsächlich gab er zu, dass er selbst auf GUIDs zurückgegriffen hatte).
Ich habe nie behauptet, dass GUIDs als Gesamtersatz für SHA-1 oder als Hashing im Allgemeinen geeignet sind (natürlich nicht). Ich sage nur, dass sie in diesem speziellen Fall verwendet werden könnten - zur eindeutigen Identifizierung einiger Entitäten. Dafür sind sie per Definition da.
Es war nie erforderlich, dass diese Kennungen aus den Daten rekonstruierbar sein müssen (was ein Vorteil von Hash-Funktionen ist). Bitte bewerten Sie meine Antwort im Kontext der eigentlichen Frage.
quelle
personalId + "+" + prefix + sectorId
es garantiert einzigartig ist, könnte es vielleicht sogar roh verwendet werden. Warum nicht? SHA1 fügt keine zusätzliche Einzigartigkeit hinzu. Das Problem ist - so wie ich es verstehe -, dass diese Formel möglicherweise keine eindeutigen Ausgaben liefert, insbesondere wenn erwartet wird, dass das System über einen längeren Zeitraum funktioniert (Gründe für die Wartbarkeit erfordern möglicherweise das Hinzufügen weiterer Sektor-IDs - Vorsicht geboten)Die Verwendung eines Hash oder einer GUID als Primärschlüssel ist ebenfalls eine schlechte Idee, da dies zu Indexfragmentierung und häufigen Seitensplits führt.
quelle