Мне нужно хранить хэш (отпечаток пальца) кредитной карты моего пользователя для последующего распознавания, чтобы всегда легко показывать свои заказы, не просматривая карту моего поставщика платежных услуг.
Мне нужен очень короткий алгоритм в PHP, но sodium_crypto_shorthash
не устойчив к столкновениям, что заставляет меня сомневаться в этом.
$key = 'jNuVurmAili4Otic';
//echo bin2hex(sodium_crypto_generichash('4242424242424242', $key,16));//32 strlen
echo bin2hex(sodium_crypto_shorthash('4242424242424242', $key)); // 16 strlen
Есть ли безопасный без столкновений PHP 7 алгоритм хеширования что может выводить максимальная длина 12 после bin2hex?
Причина, по которой SipHash64 не защищен от столкновений, заключается в его небольшом размере. Любая хеш-функция с 64-битным выводом или хеш-код, усеченный до 64-битного, скорее всего, столкнется после хеширования 2 ^ 32 сообщений.
Вы запрашиваете что-то, что возвращает 12 шестнадцатеричных символов, что означает вывод 6 байтов. Независимо от того, какой алгоритм вы используете, после хеширования 2 ^ 24 (~ 16 миллионов) номеров карт вы увидите коллизии с высокой вероятностью.
Это может быть полностью приемлемым для вашего приложения.
Других решений пока нет …