3

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

问题:

标准散列算法会生成很长的字符串,但我将不得不做一堆 ID 匹配(即“对于包含 ID XXX 的数据中的行子集,做...)”来处理匿名数据,所以这并不理想. 有没有更好的办法?

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

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

4

2 回答 2

0

似乎您并不关心 id 是可逆的,但如果有帮助,您可以尝试其中一种格式保留加密的想法。它们几乎是为这个用例设计的。

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

PS。如果您最终进行散列,请确保您预先添加了合理大小的盐。否则,[1:10M] 范围内的 ID 散列对于暴力破解来说是微不足道的。

于 2015-12-25T11:34:38.920 回答
0

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

我认为最好使用一些完全任意的一对一函数,从 ID 号码 (N) 到去识别号码 (D) 的集合。这样会更安全。如果你使用某种散列函数,并且对手知道了散列是什么,那么 N 中的数字可以在字典攻击中恢复,而不会有太多麻烦。相反,我建议使用一个简单的查找表:ID 1234567 映射到去识别号码 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
于 2015-12-25T11:38:32.610 回答