问候,
我有一些mysql表,当前使用md5哈希作为主键。我通常使用列的值生成哈希。对于instante,我们假设我有一个名为“Artists”的表,其中包含字段id,name,num_members,year。我倾向于制作一个md5($ name)并使用它有一个ID。
我想知道这样做的缺点是什么。使用AUTO_INCREMENT的整数是否更好?我倾向于逃避这一点,因为找出插入的最后一个id是什么,以及下一个会是什么等等,这是不值得的。
你能给我点亮一点吗?
谢谢。
答案 0 :(得分:2)
第一种方法有一个明显的缺点:如果有两位同名艺术家,则会发生主键冲突。使用具有自动增量的INT列将确保唯一性。
此外,虽然非常不可能,但是不同的字符串的MD5哈希值可能会发生冲突(我似乎记得概率为36中的1为32的幂)。
答案 1 :(得分:2)
在这种情况下,MD5不是真正的密钥,因为它在功能上取决于名称。这意味着如果您有两个同名的艺术家,则您有不同记录的重复“键”。您可以通过将所有属性散列在一起(并希望概率神不会向您发送冲突)使其成为真正的密钥,或者您可以省去麻烦并使用自动增量ID。
答案 2 :(得分:2)
如果需要surrogate primary key,则使用AUTO_INCREMENT字段优于md5哈希,因为数据字节较少,数据库后端优化整数主键。
如果您需要最后插入的ID,可以使用 mysql_insert_id
。
如果要将主键生成为其他列的哈希值,为什么不将这些其他列用作唯一键,然后加入这些列?
另一个问题是,使用md5哈希有什么好处?我想不出任何一个。
答案 3 :(得分:2)
您尝试使用MD5的方式似乎并没有真正为您带来任何好处。如果“$ name”是唯一的,那么为什么不使用“name”作为主键呢?计算MD5哈希并将其用作已经唯一的密钥是多余的。
另一方面,如果“name”不是唯一的,那么MD5哈希也不会是唯一的,所以它也是没有意义的。
通常,当您不想存储列的实际值时,请使用MD5哈希。例如,如果您要存储密码,通常只存储密码的MD5哈希值,而不是密码本身,这样您只需查看表格内容就无法看到人们的密码。
如果你没有任何独特的字段,那么你就会遇到类似自动增量的问题,因为它至少保证是唯一的。如果你使用内置的SQL自动增量,那么你只需要获取最后一种方式。或者,如果您可以在应用程序中本地保留一个唯一的计数器,那么就可以避免使用自动增量,但对于大多数应用程序来说不一定可行。
答案 4 :(得分:0)
如果您向客户提供ID(例如在Web表单的查询字符串中,虽然这是另一个禁止),这样做的好处是......它会阻止用户猜测另一个。
我个人使用自动增量没有问题(已将数据库移动到新服务器,一切都没有问题)