Это, вероятно, не будет полезным для OP, так как они искали двустороннюю функцию, но может помочь кому-то, ищущему более короткий хеш, чем md5.Вот что я придумал для своих нужд (спасибо https://rolandeckert.com/notes/md5 за выделение функции base64_encode).Закодируйте хэш md5 как базу (64) и удалите все нежелательные символы базы (64).Я удаляю гласные + и / или уменьшаю эффективную базу с 64 до 52.
Обратите внимание, что если вы урежете закодированный в основе (b) хэш после символов c, это позволит использовать b ^ c уникальных хэшей.Достаточно ли это надежно, чтобы избежать столкновений?Это зависит от того, сколько элементов (k) вы хэшируете.Вероятность столкновения примерно равна (k * k) / (b ^ c) / 2, поэтому, если вы использовали функцию ниже для хеширования k = 1 миллиона элементов с базовым кодированием b = 52, усеченным после c = 12 символов, вероятность столкновения<1 на 750 миллионов.Сравните с усечением хеш-кода (b = 16) после c = 12 символов.Вероятность столкновения составляет примерно 1 на 500!Просто скажите нет усеченным шестнадцатеричным хэшам.:) </p>
Я выйду на конечность и скажу, что функция ниже (длиной 12) достаточно безопасна для 10 миллионов элементов (<1 из 7,5 миллионов вероятности столкновения), но если вы хотите бытьдополнительное безопасное кодирование base (64) (закомментируйте массив $ remove) и / или усечение меньшего количества символов. </p>
// convert md5 to base64, remove undesirable characters and truncate to $length
function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = '';
// remove vowels to prevent undesirable words and + / which may be problematic
$remove = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', '+', '/');
$salt = $str;
do { // re-salt and loop if rebase removes too many characters
$salt = $base64 = base64_encode(md5($salt, TRUE));
$rebase = substr(str_replace($remove, '', $base64), 0, $length);
} while ($length < 20 && substr($rebase, -1) == '=');
return str_pad($rebase, min($length, 22), '='); // 22 is max possible length
}
$str = 'Lorem ipsum dolor sit amet 557726776';
echo '<br />' . md5($str); // 565a0bf7e0ba474fdaaec57b82e6504a
$x = md5($str, TRUE);
echo '<br />' . base64_encode($x); // VloL9+C6R0/arsV7guZQSg==
echo '<br />' . tinymd5($str, 12); // VlL9C6R0rsV7
echo '<br />' . tinymd5($str, 17); // VlL9C6R0rsV7gZQSg
$x = md5(base64_encode($x), TRUE); // re-salt triggered < 20
echo '<br />' . base64_encode($x); // fmkPW/OQLqp7PTex0nK3NQ==
echo '<br />' . tinymd5($str, 18); // fmkPWQLqp7PTx0nK3N
echo '<br />' . tinymd5($str, 19); // fmkPWQLqp7PTx0nK3NQ
echo '<br />' . tinymd5($str, 20); // fmkPWQLqp7PTx0nK3NQ=
echo '<br />' . tinymd5($str, 22); // fmkPWQLqp7PTx0nK3NQ===