php - 减少 MD5 - 使用不同的基数
问题描述
我的客户生成的促销优惠券代码不过是 32 个字符 MD5 哈希值。
我的工作是将 MD5 字符串从 32 个字符减少到少于 10 个字符,以便可以从减少的字符串重新创建哈希。
减少很重要,因为用户更容易重现减少的哈希。
例如:(719bedacf2e560b27f39d80accc67ffd => ZjKa1Gh
数学上不正确)
我遇到了这个:如何减少哈希值的长度?
它建议:使用不同的基础
我对如何在 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
,然后进行 MySQLLIKE
搜索以获取完整的 MD5。如果它返回一行,我就可以继续进行促销活动。
解决方案
我的工作是将 MD5 字符串从 32 个字符减少到少于 10 个字符,以便可以从减少的字符串重新创建哈希。
那是不可能的。一个 MD5 哈希是 128 位;一个 ASCII 字符是 7 位。没有办法将 MD5 散列存储在任何小于 128÷7 = 18.2(向上取整为 19)的 ASCII 字符中,甚至包括不可打印的控制字符。
推荐阅读
- matlab - 构造由不同幂的基矩阵组成的块矩阵
- javascript - 我有一组对象,如果其中一个键匹配(不覆盖初始属性),我想将它们组合成一个对象
- sql - 如何通过oracle中的游标更新另一个表列中不同行的表列
- php - 尝试将 xampp 数据库表连接到 php:错误未定义变量:mysqli_query 和致命错误
- node.js - 通过 Node.js 从 API 请求信息
- python - 如何使用包含占位符的“subprocess.check_call”运行“ls”命令?
- ios - 删除自定义数组中元素的安全优雅的方式,Swift
- mongodb - 如何更改嵌入类型的属性名称?
- scala - 如何通过改变随机值获得加特林模拟
- python - 在 pandas 数据框列中仅保留重复四次以上的行