Прежде чем делать что-либо радикальное, проверьте свой план запросов (как это зависит от используемого вами сервера базы данных, проверьте его документацию).
Проверьте, не можете ли вы получить индекс для работы с адресами электронной почты. Это должно немного ускорить процесс, хотя планировщик может их пропустить, потому что вы вставляете огромные объемы данных.
Когда (и только когда) вы попробовали это, вы можете посмотреть на проблему хеширования.
Я не знаю никаких алгоритмов, специально разработанных для хэширования адресов электронной почты, и, хотя вы могли бы использовать MD5, он предназначен для использования, когда вероятность коллизий должна быть настолько мала, что в принципе никогда не происходит (я не думаю, что кто-то обнаружил столкновение MD5 в дикой природе). Это можно сделать, но это дорого в вычислительном отношении. Это еще хуже, если вы используете SHA.
В вашем случае я бы предложил что-то попроще: во-первых, мы можем предположить, что все электронные письма находятся в форме
<someName>@<someServer>
Я хотел бы разделить письмо на две части, убрать все не буквенные, нечисловые символы из каждой.
Затем мы можем вычислить числовое значение для каждой из двух частей, которое мы получим, суммируя значение ascii каждой отдельной буквы (вы удалили все остальное, поэтому с многобайтовыми символами проблем не будет) .
На данный момент все, что остается сделать, - это объединить две суммы, и, поскольку мы можем ожидать, что будет гораздо меньше возможных отправителей, мы можем потратить только два байта для хранения имени сервера.
В псевдокоде:
function emailHash(namePart, serverPart){
$someName = asciiStrip(namePart)
$someServer = asciiStrip(serverPart)
$someNameSum = 0
$someServerSum = 0
foreach($letter in $someName){
$someNameSum += asciiValue($letter)
}
foreach($letter in $someServer){
$someServerSum += asciiValue($letter)
}
return ($someNameSum % 2^6)*2^2 + $someServerSum % 2^2
}
Редактировать на основе комментариев
Вы правы, этот действительно беден. Однако есть еще одна интересная вещь, которую вы можете сделать, хотя ее будет немного сложнее реализовать.
После того, как мы удалим иностранные символы, у нас есть только 36 возможных символов, поэтому нам нужно только 6 бит для хранения каждого значения. С 48 битами памяти для части имени пользователя можно хранить 8 символов с адреса электронной почты. Как низко будет столкновение для этого?
Можно было бы улучшить, как-то отменяя числа (скажем, сохраняя их после деления их на два), так что в итоге мы имеем дело только с 32 числами. Затем можно хранить каждую цифру всего в 5 битах, что в сумме составляет 9 символов.
Если это не дает достаточно низкую частоту столкновений, вам, возможно, придется использовать MD5, который должен (при условии, что алгоритм дает идеальное распределение) только с вероятностью столкновения 1 из нескольких миллиардов миллиардов.