我正在编写一个 C# 应用程序,允许用户将电子邮件存储在 MS SQL Server 数据库中。很多时候,多个用户将被复制到来自客户的电子邮件中。如果他们都尝试将相同的电子邮件添加到数据库,我想确保电子邮件只添加一次。
MD5 作为执行此操作的一种方式浮现在脑海中。我不需要担心恶意篡改,只需确保同一封电子邮件将映射到相同的哈希值,并且不会有两封内容不同的电子邮件映射到相同的哈希值。
我的问题实际上归结为如何将多个字段组合成一个 MD5(或其他)哈希值。其中一些字段在每封电子邮件中只有一个值(例如主题、正文、发件人电子邮件地址),而其他字段将有多个值(不同数量的附件、收件人)。我想开发一种唯一标识与平台和语言无关(不基于序列化)的电子邮件的方法。有什么建议吗?
最佳答案
您计划归档多少电子邮件?如果您不希望存档需要很多 TB,我认为这是一个过早的优化。
由于每个字段都可以表示为字符串或字节数组,因此无论它包含多少个值,对于哈希函数来说它们看起来都是一样的。只需将它们全部散列在一起,您将获得一个唯一标识符。
编辑伪代码示例
# 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 + ...)
提取字符串的方式和接口(interface)会因您的应用程序、语言和 API 而异。
当给定相同的输入时,不同的电子邮件客户端可能会为某些字段生成不同的格式并不重要,这将为您提供原始电子邮件的唯一哈希值。
关于email - 电子邮件的唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684160/