电子邮件的唯一标识符

时间:2010-04-21 15:11:25

标签: email cryptography md5 uniqueidentifier

我正在编写一个C#应用程序,它允许用户在MS SQL Server数据库中存储电子邮件。很多时候,会在客户的电子邮件中复制多个用户。如果他们都尝试将相同的电子邮件添加到数据库,我想确保只添加一次电子邮件。

MD5会让人想到这一点。我不需要担心恶意篡改,只是为了确保同一封电子邮件将映射到相同的散列,并且没有两封具有不同内容的电子邮件将映射到相同的散列。

我的问题实际上归结为如何将多个字段组合成一个MD5(或其他)哈希值。其中一些字段每封电子邮件只有一个值(例如主题,正文,发件人电子邮件地址),而其他字段则具有多个值(不同数量的附件,收件人)。我想开发一种唯一标识电子邮件的方法,该电子邮件将独立于平台和语言(不基于序列化)。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您计划存档的电子邮件数量是多少?如果你不希望存档需要很多TB,我认为这是一个不成熟的优化。

由于每个字段可以表示为字符串或字节数组,因此它包含多少个值并不重要,它们对哈希函数看起来都相同。只需将它们一起散列,就可以获得唯一的标识符。

编辑 Psuedocode示例

# intialized the hash object
hash = md5()

# compute the hashes for each field
hash.update(from_str)
hash.update(to_str)
hash.update(cc_str)
hash.update(body_str)
hash.update(...) # the rest of the email fields

# compute the identifier string
id = hash.hexdigest()

如果用

替换所有更新调用,您将获得相同的输出
# concatenate all fields and hash
hash.update(from_str + to_str + cc_str + body_str + ...)

如何提取字符串和界面将根据您的应用程序,语言和API而有所不同。

当给出相同的输入时,不同的电子邮件客户端可能会为某些字段生成不同的格式并不重要,这将为您提供原始电子邮件唯一的哈希值。

答案 1 :(得分:1)

您是否看过其他标题(在我的邮件中,OS X Mail):

X-Universally-Unique-Identifier: 82d00eb8-2a63-42fd-9817-a3f7f57de6fa
Message-Id: <EE7CA968-13EB-47FB-9EC8-5D6EBA9A4EB8@example.com>

至少需要Message-Id。对于同一邮件(发送给多个收件人),该字段可能相同。这比散列更有效。

不是问题的答案,但可能是问题的答案:)

答案 2 :(得分:1)

为什么不哈希原始邮件?它已经编码了除信封发件人和收件人之外的所有相关字段,您可以在散列之前自己添加这些字段作为标题。它还包含所有附件,消息的整个主体等,这是一种自然而简单的表示。它也不会受到mikerobi提案容易产生的哈希冲突的影响。