【发布时间】:2018-11-05 12:53:21
【问题描述】:
我的客户生成的促销优惠券代码不过是 32 个字符 MD5 哈希值。
我的工作是将 MD5 字符串从 32 个字符减少到少于 10 个字符,以便可以从减少的字符串重新创建哈希。
减少很重要,因为用户更容易重现减少的哈希。
例如:719bedacf2e560b27f39d80accc67ffd => ZjKa1Gh(数学上不正确)
我遇到了这个:How to reduce hash value's length?
这表明:使用不同的基础
我不知道如何在 PHP 中执行此操作,我们可以将字符串解码为其 ASCII 并重新编码吗?
在这种情况下我可以使用 PHP 中的任何内置函数吗?
$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。如果它返回一行,我就可以继续进行促销活动。
【问题讨论】:
-
目前还不清楚您到底想做什么。没有办法将给定的 md5 哈希“减少到它的 ASCII”,这应该是什么意思?哈希已经是 ASCII 编码。
-
我的意思是询问字符串是否可以在 PHP 中简化为它的 ASCII,从某种意义上说,如果有
A,我会得到065作为输出。如果我能得到065,那么我可以用不同的方式存储它。 -
啊,你的意思是字符代码。你正在寻找php.net/manual/en/function.ord.php,但我怀疑这会让你前进。