我正在编写一个C#应用程序,它允许用户在MS SQL Server数据库中存储电子邮件。很多时候,会在客户的电子邮件中复制多个用户。如果他们都尝试将相同的电子邮件添加到数据库,我想确保只添加一次电子邮件。
MD5会让人想到这一点。我不需要担心恶意篡改,只是为了确保同一封电子邮件将映射到相同的散列,并且没有两封具有不同内容的电子邮件将映射到相同的散列。
我的问题实际上归结为如何将多个字段组合成一个MD5(或其他)哈希值。其中一些字段每封电子邮件只有一个值(例如主题,正文,发件人电子邮件地址),而其他字段则具有多个值(不同数量的附件,收件人)。我想开发一种唯一标识电子邮件的方法,该电子邮件将独立于平台和语言(不基于序列化)。有什么建议吗?
答案 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提案容易产生的哈希冲突的影响。