使用pandas将唯一数字转换为MD5哈希值

8

大家早上好。

我想将我的社会保障号码转换成MD5哈希十六进制数。结果应该是每个社会保障号码的唯一MD5哈希十六进制数。

我的数据格式如下:

ob = onboard[['regions','lname','ssno']][:10]
ob

    regions lname   ssno
0    Northern Region (R1)    Banderas    123456789
1    Northern Region (R1)    Garfield    234567891
2    Northern Region (R1)    Pacino  345678912
3    Northern Region (R1)    Baldwin     456789123
4    Northern Region (R1)    Brody   567891234
5    Northern Region (R1)    Johnson     6789123456
6    Northern Region (R1)    Guinness    7890123456
7    Northern Region (R1)    Hopkins     891234567
8    Northern Region (R1)    Paul    891234567
9    Northern Region (R1)    Arkin   987654321

我用以下代码尝试使用hashlib

import hashlib

ob['md5'] = hashlib.md5(['ssno'])

这给了我一个错误,说它必须是字符串而不是列表。所以我尝试了以下方法:

ob['md5'] = hashlib.md5('ssno').hexdigest()



regions lname   ssno    md5
0    Northern Region (R1)    Banderas    123456789   a1b3ec3d8a026d392ad551701ad7881e
1    Northern Region (R1)    Garfield    234567891   a1b3ec3d8a026d392ad551701ad7881e
2    Northern Region (R1)    Pacino  345678912   a1b3ec3d8a026d392ad551701ad7881e
3    Northern Region (R1)    Baldwin     456789123   a1b3ec3d8a026d392ad551701ad7881e
4    Northern Region (R1)    Brody   567891234   a1b3ec3d8a026d392ad551701ad7881e
5    Northern Region (R1)    Johnson     678912345   a1b3ec3d8a026d392ad551701ad7881e
6    Northern Region (R1)    Johnson     789123456   a1b3ec3d8a026d392ad551701ad7881e
7    Northern Region (R1)    Guiness     891234567   a1b3ec3d8a026d392ad551701ad7881e
8    Northern Region (R1)    Hopkins     912345678   a1b3ec3d8a026d392ad551701ad7881e
9    Northern Region (R1)    Paul    159753456   a1b3ec3d8a026d392ad551701ad7881e

这跟我需要的很接近,不过所有的十六进制数输出都一样,无论社会安全号码是否不同。我想要获得每个社会安全号码唯一的十六进制数。有什么建议吗?

1
不要对社会安全号码进行哈希处理并认为它提供了任何混淆效果。社会安全号码空间很小,对这些未加盐的哈希值进行反向操作对于任何人来说都是微不足道的。如果您关心正在哈希处理的个人信息的隐私,那么您至少应该使用hmac模块而不是直接使用哈希处理。 - gps
非常感谢您抽出时间回复这个评论!非常珍贵!我不知道哈希可以被反转。我会研究hmac模块。再次感谢! - Dave
2个回答

15

hashlib.md5 只接受单个字符串作为输入--你不能像一些NumPy/Pandas函数那样传递数组值。因此,你可以使用列表推导式来构建md5sums列表:

ob['md5'] = [hashlib.md5(val).hexdigest() for val in ob['ssno']]

非常好!很有道理。感谢您的教育和协助解决问题!正是我所需要的! - Dave
2
对于在此遇到“需要支持缓冲区API的对象”错误的任何人,可能是由于您的Pandas系列中存在空(NaN)值,需要在哈希之前进行处理或删除。 - rocksteady

3

如果您要进行SHA256哈希,首先需要将字符串编码为(可能是)UTF-8:

ob['sha256'] = [hashlib.sha256(val.encode('UTF-8')).hexdigest() for val in ob['ssno']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接