email - 电子邮件的唯一标识符

标签 email cryptography md5 uniqueidentifier

我正在编写一个 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/

相关文章:

javascript - Google MailApp.sendEmail 带有另一个 <sent from> 字段

google-app-engine - 带有 GAE 和每分钟配额的批量电子邮件

c# - C#和golang的MD5不一致

java - 通过 Java 在 Matlab 中计算 MD5 哈希(符合 RFC 1321)

C# 等效于 PHP 的原始输出 MD5?

web-services - IMAP 转发器

email - 使用Powershell发送延迟消息传递并更改默认帐户

cryptography - AES CBC 中初始化向量的意义是什么?

java - 加密安全 PRNG(伪随机数生成器)

Java MD5 哈希函数给出不正确的哈希值