哪个算法用于散列人的姓名,名字和出生日期

|| 我必须将一个人的姓,名和出生日期的组合另存为哈希。以后,此哈希用于搜索具有完全相同属性的同一个人。 我的问题是,SHA-1是否对此有意义。 据我了解SHA-1,实际上几乎不可能有两个不同的人(具有不同的属性)获得相同的哈希值。这是正确的吗?     
已邀请:
如果要搜索仅知道这些凭据的人员,则可以将SHA-1存储在数据库中(或将MD5存储在速度中,除非您有四分位数的人员可以采样)。 散列将毫无价值,因为它不存储有关该人的信息,但可以用于搜索数据库。您只想确保三个信息匹配,所以将它们串联起来是安全的:
user.hash = SHA1(user.firstName + user.DOB + user.lastName)
当您查询时,可以检查两者是否匹配:
hash = SHA1(query.firstName + query.DOB + query.lastName)

for user in database:
  if user.hash == hash:
    return user
我将put2ѭ放在中间,因为名字和姓氏可能会冲突,就像
JohnDoe Bob
John DoeBob
在同一天出生一样。我不知道数字名称,所以我认为这将阻止像这样的碰撞;) 但是,如果这是一个大数据库,我将尝试MD5。它的速度更快,但是有可能发生碰撞(在您的情况下,我可以保证不会发生碰撞)。但是,发生碰撞的机会确实很小。 从一个角度看,碰撞是“ 5”次发生,即:
                          1
---------------------------------------------------
340,282,366,920,938,463,463,374,607,431,768,211,456
而且比:
0.0000000000000000000000000000000000000293873 %
我很确定您不会撞车;)     
哈希冲突是不可避免的。但是,发生碰撞的机会可能很小,如果您确实想要100%的标识,则不应真正仅依赖哈希。 如果使用散列来加快数据库搜索,则无需使用SHA256。使用系统具有最小大小的任何哈希函数(对于MySQL为MD5(),如果数据库不是那么大,甚至可以尝试CRC32)。仅当查询表时,您需要提供要搜索的所有条件: 从用户WHERE hash = \“ AABBCCDD \” AND firstname = \“ Pavel \” AND姓氏= \“ Sokolov \”中选择* 数据库维护一个值,称为索引基数。它衡量给定索引上数据的唯一性。因此,您可以将所需的索引字段与哈希字段一起使用,数据库将为查询本身选择最有选择性的索引。添加其他条件不会对性能产生负面影响,因为大多数数据库在从表中选择数据时只能使用一个索引,并且它们将选择基数最大的索引。 数据库首先需要选择与索引匹配的所有行,然后对它们进行扫描以丢弃与其他条件不匹配的行。 如果您不能使用我描述的方法,那么我认为即使是MD5碰撞概率也很低,无法在人名数据库中发生。 附言我希望您知道,您知道“一个人的姓氏,名字和出生日期的组合”不足以100%识别一个人吗?而且这种组合比某些散列碰撞更早会匹配。     
如果您担心碰撞,这里有一个很好的讨论: 了解sha-1碰撞的弱点 如果您有安全问题,我会考虑使用SHA-256。     

要回复问题请先登录注册