Für den konkreten Anwendungsfall ist es gar nicht nötig, die Mailadresse selbst zu haschen. Du kannst genau genommen auch eine ID aus der, die Adressen beinhaltenden Tabelle salzen und "hashen" oder noch besser: statt überhaupt zu haschen, in der Tabelle einen eindeutigen (unique) Zufallswert ablegen, der groß genug ist, um nicht einfach alle Zahlen von 1-10000 durchraten zu können.
Eine Idee wäre es, eine UUID zuzuordnen. Auf Linux Systemen kann man die mit einem lesenden Zugriff auf /proc/sys/kernel/random/uuid eine (pseudo-)zufällige UUID erzeugen. Hier mal ein Test:
<?php
for ($i=0; $i<20; $i++) {
$uuid=trim(file_get_contents('/proc/sys/kernel/random/uuid'));
echo $uuid,"<br>\n";
}
?>
Mit PHP selbst kann man eine zeitbasierte UUID erzeugen. Lese (auch die Kommentare):
http://php.net/manual/de/function.uniqid.php
Vorteil der zugeordneten UUID wäre es, dass ohne Deine Zuordnungstabelle gar kein Zusammenhang zwischen der UUID und der Mailadresse besteht. Wenn aber die Tabelle in fremde Hände gerät, dann ist eh "Schluss mit lustig", weil die Adressen ja offenbar auch im Klartext gespeichert sind.
Falls Du bei MD5 oder einem anderen Hash bleiben willst:
Da Rainbow-Tables für jeden Hash-Alghorithmus existieren empfehle ich die Adressen zu salzen. Da (und wenn) es nur um den Schutz nicht besonders wichtiger Daten geht mag wohl einfaches Salzen und Haschen mit md5 genügen.
Eignet sich MD5 hier? Wird jeder Hash ohne Konflikte eindeutig zuordenbar bleiben?
Aber ja. Die Wahrscheinlichkeit eines Konfliktes ist hinsichtlich der Entropie Länge der Mailadressen gering.