在2 TB的CSV中匿名化账号';s

在2 TB的CSV中匿名化账号';s,csv,bigdata,anonymize,Csv,Bigdata,Anonymize,我有大约2TB的CSV,其中前两列包含两个ID号。这些数据需要匿名,以便用于学术研究。匿名化可以(但不一定)是不可逆转的。这些不是医疗记录,所以我不需要最高级的密码算法 问题: 标准的散列算法会产生很长的字符串,但我必须进行大量的ID匹配(即“对于包含ID XXX的数据中的行子集,do…),以处理匿名数据,因此这并不理想。有更好的办法吗 例如,如果我知道有大约1000万个唯一的帐号,是否有一种标准的方法使用整数集[1:1000万]作为替换/匿名ID 计算上的限制是,数据可能在32核~500GB服

我有大约2TB的CSV,其中前两列包含两个ID号。这些数据需要匿名,以便用于学术研究。匿名化可以(但不一定)是不可逆转的。这些不是医疗记录,所以我不需要最高级的密码算法

问题:

标准的散列算法会产生很长的字符串,但我必须进行大量的ID匹配(即“对于包含ID XXX的数据中的行子集,do…),以处理匿名数据,因此这并不理想。有更好的办法吗

例如,如果我知道有大约1000万个唯一的帐号,是否有一种标准的方法使用整数集[1:1000万]作为替换/匿名ID


计算上的限制是,数据可能在32核~500GB服务器机器上匿名化。

您似乎不关心ID的可逆性,但如果有帮助,您可以尝试其中一种方法。它们基本上是为这个用例设计的

否则,如果散列太大,您总是可以去掉它的末尾。即使将(原始ID的)每个数字替换为(哈希中的)十六进制数字,也不太可能发生冲突。您可以先读取文件并检查冲突


另外,如果你最后做了散列,确保你预先准备了一个合理大小的盐。在[1:10M]范围内的ID散列对于bruteforce来说是微不足道的。

我假设您想要进行一次传递,一次带有ID的CSV 数字作为输入,另一个以匿名数字作为输出的CSV。我会的 还假设唯一ID的数量大约为10 百万或更少

我认为最好使用一些完全武断的方法 从ID编号集(N)到ID编号集的一对一函数 取消识别号(D)。这样会更安全。如果你用了一些 一种散列函数,一个对手知道散列是什么 N中的数字可以在不太麻烦的情况下恢复 字典攻击。相反,我建议使用一个简单的查找表:ID1234567 映射到取消识别号4672592等。通信将 存储在另一个文件中,没有该文件的对手将不会 能够做很多事情

在你所描述的机器上有1000万条或更少的记录, 这不是什么大问题。伪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

(a*x+b)%m;m约为1000万,是一个奇数且相对优质的wrt m;并对a和b保密。账号(或每个密钥)中是否有格式?如果gcd(a,m)==1(“相对素数”),则不存在格式。用{a,m}:=(小)素数试试。(对于OP,m当然必须>=max(原始数字))有一种格式,但我不会看到它——我必须在事先不知道格式的情况下创建匿名策略。如果你对所有内容使用不同的盐,你需要将它们全部存储。如果你对所有人都使用相同的盐,那么它就不是真正的盐,是吗?从技术上说,不是-也许我不应该称之为盐。如果要确保相同的原始ID对应于相同的哈希,则必须在处理过程中存储它们。但我不确定这在这种情况下有多重要。只需为所有人生成一个巨大的随机salt,就可以提供所需的内容(防止暴力)。密码存储中的salt是不同的,这样可以扩展搜索空间,并且普通密码不会散列到相同的值。这里我们只需要扩展空间。有人能解释为什么这会被否决吗?我原本打算按照同样的思路做一些事情……我能看到的唯一缺点是对象“映射”变得非常大,这意味着“映射中的if N:…do”行在匿名化结束时可能会变得非常慢。@cataclysmic:它不应该变慢
mapping
是一个
dict
,本质上是一个哈希表,访问应该更像O(1)而不是O(N)。至少,只要有足够的RAM来避免交换,而且你提到的机器应该有足够的RAM。