根据RFC,电子邮件的message-id应该是唯一的,只需使用它们的一些报头就可以对其进行重复数据删除,这是真的吗?
有没有办法计算在下面的重复数据消除方法中丢失1封电子邮件的机会(这3个邮件头的sha512哈希)?
// $email is a parsed array containing 3 keys (mime headers) -> message_id, subject and date. $hashStr = $email['message_id']; $hashStr .= $email['subject']; $hashStr .= $email['date']; $uniqueEmailId = hash('sha512', $hashStr);
这是一种关键的任务,不会遗漏任何一封电子邮件,很可能我们必须对几个(>20)亿个mime文件进行重复数据删除。
发布于 2014-04-16 02:38:56
SHA512散列产生具有512位数据的散列值。假设位的随机分布,则计算出的值大于1.34e+154可能的值。即使有过多的2e+9样本,意外碰撞的可能性也非常接近于零。
但是,您对散列的输入并不是完全随机的。message_id是一个“唯一”具有5.3e+36个可能值的globally unique identifier,其随机性取决于实现。根据维基链接,在4.2e+18样本中发生碰撞的几率约为50%。电子邮件地址和日期可能比这要高得多。
也就是说,在没有真正做概率数学的情况下,我会说概率可以忽略不计。
发布于 2014-04-22 05:46:08
如果message-id已经是唯一的,那么散列就没有什么意义(因此引入了公认可以忽略不计的冲突机会)。
似乎更健壮的方法是使用message-id本身作为比较的基础。
发布于 2022-01-29 09:35:38
即使RFC说Message-ID必须是全局唯一的,它仍然是生成这些标头的发送者。
您不能相信发件人是否符合RFC (如果发件人软件不受您的控制)。
原始发送者可能不想生成全局唯一的Message-ID,或者他正在使用具有相同Message-ID的模板向不同的收件人发送副本。
我不知道有没有电子邮件服务器可以验证Message-ID头的唯一性。
如果你想对电子邮件进行重复数据删除,最好的解决方案是用足够的比特计算其整个内容的加密安全散列。IMHO 160位足够20亿。
https://stackoverflow.com/questions/22841666
复制相似问题