Уникальный идентификатор электронной почты - PullRequest
3 голосов
/ 21 апреля 2010

Я пишу приложение на C #, которое позволяет пользователям хранить электронную почту в базе данных MS SQL Server. Много раз, несколько пользователей будут скопированы по электронной почте от клиента. Если они все попытаются добавить одно и то же электронное письмо в базу данных, я хочу убедиться, что электронное письмо добавляется только один раз.

MD5 приходит на ум как способ сделать это. Мне не нужно беспокоиться о мошенничестве, только чтобы убедиться, что одно и то же электронное письмо будет сопоставлено с одним и тем же хешем, и что никакие два электронных письма с различным содержанием не будут сопоставлены с одним и тем же хешем.

Мой вопрос действительно сводится к тому, как можно объединить несколько полей в одно хеш-значение MD5 (или другое). Некоторые из этих полей будут иметь одно значение для каждого электронного письма (например, тема, тело, адрес электронной почты отправителя), в то время как другие будут иметь несколько значений (различное количество вложений, получатели). Я хочу разработать способ уникальной идентификации электронной почты, который будет независимым от платформы и языка (не основанным на сериализации). Любой совет?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2010

Какой объем писем вы планируете архивировать? Если вы не ожидаете, что архив потребует много терабайт, я думаю, это преждевременная оптимизация.

Поскольку каждое поле может быть представлено в виде строки или массива байтов, не имеет значения, сколько значений оно содержит, все это выглядит одинаково для хэш-функции. Просто объедините их все вместе, и вы получите уникальный идентификатор.

РЕДАКТИРОВАТЬ Пример 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 голос
/ 22 апреля 2010

Почему бы просто не хэшировать необработанное сообщение? Он уже кодирует все соответствующие поля, кроме отправителя и получателя конверта, и вы можете добавить их в качестве заголовков перед хэшированием. Он также содержит все вложения, все тело сообщения и т. Д., И это естественное и простое представление. Он также не страдает от легко генерируемых коллизий хеша в предложении mikerobi.

1 голос
/ 21 апреля 2010

Вы смотрели на некоторые другие заголовки, например (в моей почте OS X Mail):

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

Требуется хотя бы идентификатор сообщения. Это поле вполне может быть одинаковым для одной и той же рассылки (отправить нескольким получателям). Это было бы более эффективно, чем хеширование.

Не ответ на вопрос, но, возможно, ответ на вопрос:)

...