Мой клиент генерирует промо-коды купонов, которые представляют собой не более чем 32 символа MD5-хэшей.
Моя задача состоит в том, чтобы уменьшить строку MD5 с 32 до менее чем 10 символов таким образом, чтобы хэш можно было воссоздать изсокращенная строка.
Сокращение важно, поскольку пользователям было бы проще воспроизвести уменьшенный хеш.
Например, например: 719bedacf2e560b27f39d80accc67ffd => ZjKa1Gh
(математически не верно)
Я сталкивался с этим: Как уменьшить длину хеш-значения?
Он предлагает: Использование другой базы
Я не знаю, каксделать это в PHP, можем ли мы декодировать строку в ее ASCII и перекодировать ее?
Есть ли в PHP встроенные функции, которые я могу использовать в этом случае?
Обновление с использованием https://packagist.org/packages/aza/math
$original = '719bedacf2e560b27f39d80accc67ffd';
$long1 = NumeralSystem::convert($original, 16, 10);
$short = NumeralSystem::convertTo($long1, 62);
$long2 = NumeralSystem::convertFrom($short, 62);
$recovered = NumeralSystem::convert($long2, 10, 16);
var_dump($long1);
var_dump($short);
var_dump($long2);
var_dump($recovered);
// output
string(39) "151012390170261082849236619706853916669"
string(22) "3SNOKWefotgnnCmWnYkTOf"
string(39) "151012390170261082849236619706853916669"
string(32) "719bedacf2e560b27f39d80accc67ffd"
Похоже, что самое низкое, что я могу достичь из 32 символов MD5 - это 22 символа таким образом.Я все еще ищу способы, с помощью которых я могу еще уменьшить его до 10 символов.
Обновление: использование первой половины MD5
$original = '719bedacf2e560b';
$coupon = NumeralSystem::convert($original, 16, 62);
$recovered = NumeralSystem::convert($coupon, 62, 16);
var_dump($coupon);
var_dump($recovered);
// output
string(10) "bnMR3RjZil"
string(15) "719bedacf2e560b"
Если пользователь предоставляетbnMR3RjZil
Я могу использовать это для воссоздания 719bedacf2e560b
, а затем выполнить поиск MySQL LIKE
, чтобы получить полный MD5.Если он возвращает строку, я могу продолжить рекламную деятельность.