首页 > 解决方案 > 减少 MD5 - 使用不同的基数

问题描述

我的客户生成的促销优惠券代码不过是 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,然后进行 MySQLLIKE搜索以获取完整的 MD5。如果它返回一行,我就可以继续进行促销活动。

标签: phphashbase

解决方案


我的工作是将 MD5 字符串从 32 个字符减少到少于 10 个字符,以便可以从减少的字符串重新创建哈希。

那是不可能的。一个 MD5 哈希是 128 位;一个 ASCII 字符是 7 位。没有办法将 MD5 散列存储在任何小于 128÷7 = 18.2(向上取整为 19)的 ASCII 字符中,甚至包括不可打印的控制字符。


推荐阅读