我想使用MySQL表字段(question_id)中的整数与Auto Incr引入短uniq字符串ID。
示例当用户指向www.something.com/SjBWY -> php将获取id=23511的记录;
我想隐藏关于问题数量的信息,并引入question_code,它将使用某种翻译算法将1对1映射到question_id。我不想在数据库中存储question_code,我相信MySQL开发人员比我聪明,他们已经创建了可靠的机制来生成唯一的数字。
天真的方法: (http://ideone.com/rK4hzx)
$num = 11231;
while($num > 0) {
$v = ord( $num % 10);
$v += 25;
echo chr($v);
$num = round($num / 10);
}
// JLKJJ
$result = array_reverse(str_split('JLKJJ'));
foreach ($result as $single) {
echo chr(ord( $single)-25);
}
// 11231
问题:你能提出更好的解决方案吗?
朴素方法弱点:
- 我希望能够使用大小字母
- 我希望能够限制字符串长度为5尽可能长。
- 在生成的字符串中不应该是明显的一个序列。11的值应该尽可能远离12。
编辑算法应该是对称的意味着我可以转换Int->String和String->Int。MD5和其他哈希算法只有一种方式,我无法从String->Int
终于找到我要找的东西了。它被称为:http://www.hashids.org/它有php, java,nodejs,ruby,.net等版本
Hashids被设计用于URL缩短,跟踪东西,验证帐户或使页面私有(通过抽象)。而不是显示为1、2或3项,您可以显示为b9i9xia, EATedTBy和Aaco9cy5。哈希值取决于你的盐值。
哈希不是一个好的选择,因为有可能发生冲突。你需要一个双射变换。
例如,您可以加密ID…
可选地,对结果位串进行base64编码,或者使用6位块和字符映射(例如[a- za - z0 -9_-])达到这种效果。
无论您做什么,确保您可以相当容易地进行反向转换。
为什么不将唯一的字符串ID转换为字节,然后转换为长/整型?将长/int转换为字节,然后转换为字符串....