2014-04-03 138 views
5

电子邮件是否可以通过根据RFC使用它们的一些标题进行重复数据删除?它们的消息标识应该是唯一的吗?电子邮件重复数据删除

有没有什么方法可以计算在下面的重复数据删除方法中错过了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);

这是一种关键任务,没有任何一个邮件将被错过的,有机会,我们有进行重复数据删除在多个(> 2)十亿MIME文件。

回答

4

SHA512散列产生具有512位数据的散列值。假定随机分布的位数,这可以达到超过1.34e + 154个可能的值。即使超过2e + 9个样本,意外碰撞的几率也几乎为零。

但是,您的散列输入不是那么随机的。 message_idglobally unique identifier,其中“仅”具有5.3e + 36个可能的值,并且随机性取决于实现。根据维基链接,4.2e + 18个样本的碰撞几率约为50%。电子邮件地址和日期可能显着高于此。

这就是说,没有真正做数学概率,我会说赔率可以忽略不计。

+0

消息ID在这个意义上不是GUID。它是全球独一无二的,但以特定实施方式构建。通常的技巧是将左边的十六进制timestamp_seq#和@符号右边的主机名组合起来。 请参阅RFC 2822第22-24页 –

2

如果message-id已经是唯一的,那么散列没有多大意义(因此引入了可以忽略的碰撞几率)。
似乎更强大的方法是使用消息id本身作为比较的基础。

+0

messageid,主题和日期的这种组合会不会使散列碰撞机会更低? – Floris

+0

@弗罗里斯不,它首先会引入碰撞的机会。我并不是在谈论如何对msgid进行哈希处理,而是从字面上理解它,因为它已经被认为是一个唯一的标识符 – fstd

+0

我知道,但是我必须处理(非常大)的电子邮件数据量(超过10k个账户,每个账户有20k条消息) ),所以我需要1个密钥才能获得唯一的消息。不幸的是,在我的测试中,似乎Message-ID头部并非真正“独特”。 – Floris