6

是否可以通过仅使用其某些标头来对电子邮件进行重复数据删除,因为根据 RFC,它们的消息 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);

不会遗漏任何一封电子邮件是一项至关重要的任务,很可能我们不得不对数个(>2)十亿个 mime 文件进行重复数据删除。

4

3 回答 3

4

SHA512 散列产生一个包含 512 位数据的散列值。假设位的随机分布,这可以得到超过 1.34e+154 个可能的值。即使有超过 2e+9 个样本,意外碰撞的可能性也非常接近于零。

但是,您对哈希的输入并不是那么随机。 message_id是一个全局唯一标识符,它“仅”有 5.3e+36 个可能的值,随机性取决于实现。根据 wiki 链接,在 4.2e+18 个样本处发生碰撞的几率约为 50%。电子邮件地址和日期可能远高于此。

也就是说,如果没有实际进行概率数学,我会说几率可以忽略不计。

于 2014-04-15T18:38:55.633 回答
2

如果 message-id 已经是唯一的,那么散列就没有什么意义(因此引入了公认的可以忽略不计的冲突机会)。
似乎更健壮的方法是使用 message-id 本身作为比较的基础。

于 2014-04-21T21:46:07.663 回答
0

即使 RFC 说 Message-ID 必须是全局唯一的,生成这些标头的仍然是发送者。

您不能相信发件人符合 RFC(如果发件人软件不受您控制)。

原始发件人可能不想生成全局唯一的 Message-ID,或者他正在使用具有相同 Message-ID 的模板向不同的收件人发送副本。

我不知道任何验证 Message-ID 标头唯一性的电子邮件服务器。

如果您想对电子邮件进行重复数据删除,最好的解决方案是使用足够位计算其整个内容的加密安全哈希。恕我直言,160 位足够 20 亿。

于 2022-01-29T09:35:38.480 回答