MD5重复条目mySQL

时间:2012-11-09 18:19:00

标签: php mysql md5

当谈到单个mySQL脚本时,我遇到了一些问题;特别是,mySQL一直给我这个错误:

MySQL Error: Duplicate entry '39835a3f63f222c9bf51d9dd471b90bc' for key 'PRIMARY'

这很奇怪,因为有问题的主键是基于php的time()函数的MD5生成的哈希,所以不应该有任何问题。

这是插入表格的PHP代码:

INSERT INTO log
    (hailID, timestamp, lat, lng, phone, device, method, serviceType, email, address, languageID, ipaddress)
        VALUES
    (MD5('" . $time . $data['phone'] . "'),
     '$time',
     '".$data['lat']."',
     '".$data['lng']."',
     '".$data['phone']."',
     '".$data['device']."',
     '".$data['method']."',
     '".$data['serviceType']."',
     '".$data['email']."',
     '".$data['address']."',
     '".$data['languageID']."',
     '".$_SERVER["REMOTE_ADDR"]."'
在这种情况下,

$time只是一个保存time()函数值的变量。有趣的是,这个问题不是很频繁,而且似乎是随机的(至少据我所知)。是的,所有数据在进入mysqli_escape_string()数组之前都使用$data进行了清理。我还使用CHECK TABLE检查了我的表格,也没有出现任何错误。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

如果在同一秒内记录了2个条目,则它们将具有相同的哈希值。即使是使用率相当低的系统,这种情况也会比你想象的更频繁。我建议:

  1. 废除哈希。使用DATETIME将当前时间存储为TIMESTAMPNOW()。你实际上有一个可排序的表。
  2. 在日志文件中使用代理键,即INT AUTO_INCREMENT
  3. 如果您需要存储一个确切的,唯一的时间并避免重复,请查看PHP的microtime()函数。
  4. 考虑一下,即使您将ID存储为8字节BIGINT,它仍然比存储MD5哈希所需的VARCHAR(32)小4倍。

答案 1 :(得分:0)

好吧,有时你可能遇到MD5哈希两次相同的情况。特别是如果(在您的情况下)某人每秒两次添加相同的电话号码 - 生成的哈希值肯定是相同的。为什么不使用自动增量主键?