Ich habe ~ 2 TB CSVs, wobei die ersten 2 Spalten zwei ID-Nummern enthalten. Diese müssen anonymisiert werden, damit die Daten in der akademischen Forschung verwendet werden können. Die Anonymisierung kann (muss aber nicht) irreversibel sein. Dies sind KEINE medizinischen Unterlagen, daher benötige ich nicht den ausgefallensten kryptografischen Algorithmus.

Die Frage:

Standard-Hashing-Algorithmen machen wirklich lange Zeichenfolgen, aber ich muss eine Reihe von ID-Übereinstimmungen durchführen (dh "für eine Teilmenge von Zeilen in Daten, die ID XXX enthalten, tun ...)", um die anonymisierten Daten zu verarbeiten, daher ist dies nicht ideal . Gibt es einen besseren Weg?

Wenn ich zum Beispiel weiß, dass es ~ 10 Millionen eindeutige Kontonummern gibt, gibt es eine Standardmethode, um den Satz von Ganzzahlen [1: 10 Millionen] als Ersatz- / anonymisierte IDs zu verwenden?

Die Rechenbeschränkung besteht darin, dass Daten wahrscheinlich auf einem 32-Kern-Server mit ~ 500 GB anonymisiert werden.

3
cataclysmic 25 Dez. 2015 im 14:19

2 Antworten

Beste Antwort

Ich gehe davon aus, dass Sie einen einzelnen Durchgang durchführen möchten, eine CSV mit ID-Nummern als Eingabe, eine weitere CSV mit anonymisierten Nummern als Ausgabe. Ich gehe auch davon aus, dass die Anzahl der eindeutigen IDs in der Größenordnung von 10 Millionen oder weniger liegt.

Ich bin der Meinung, dass es am besten ist, eine völlig willkürliche Eins-zu-Eins-Funktion von der Menge der ID-Nummern (N) bis zur Menge der nicht identifizierten Nummern (D) zu verwenden. Dies wäre sicherer. Wenn Sie eine Art Hash-Funktion verwendet haben und ein Gegner erfahren hat, was der Hash ist, können die Zahlen in N ohne allzu große Probleme mit einem Wörterbuchangriff wiederhergestellt werden. Stattdessen schlage ich eine einfache Nachschlagetabelle vor: ID 1234567 wird der nicht identifizierten Nummer 4672592 usw. zugeordnet. Die Korrespondenz würde in einer anderen Datei gespeichert, und ein Gegner ohne diese Datei könnte nicht viel tun.

Bei 10 Millionen oder weniger Datensätzen auf einem Computer, wie Sie ihn beschreiben, ist dies kein großes Problem. Ein Skizzenprogramm in Pseudo-Python:

mapping = {}
unused_numbers = list(range(10000000))

while data:
    read record
    for each ID number N in record:
        if N in mapping:
            D = mapping[N]
        else:
            D = choose_random(unused_numbers)
            unused_numbers.del(D)
            mapping[N] = D
        replace N with D in record
    write record

write mapping to lookup table file
0
Tom Zych 25 Dez. 2015 im 11:43

Es scheint, dass es Ihnen egal ist, ob die IDs umkehrbar sind, aber wenn es hilft, können Sie eine der > Formatverschlüsselung Ideen. Sie sind so ziemlich für diesen Anwendungsfall konzipiert.

Andernfalls können Sie bei zu großen Hashes immer nur das Ende entfernen. Selbst wenn Sie jede Ziffer (der ursprünglichen ID) durch eine hexadezimale Ziffer (aus dem Hash) ersetzen, sind Kollisionen unwahrscheinlich. Sie könnten jedoch zuerst die Datei lesen und nach Kollisionen suchen.

PS. Wenn Sie am Ende Hashing machen, stellen Sie sicher, dass Sie Salz einer angemessenen Größe voranstellen. Hashes von IDs im Bereich [1: 10M] wären ansonsten für Bruteforce trivial.

0
viraptor 25 Dez. 2015 im 11:39