我想使用带有Auto Incr的MySQL表字段(question_id)中的整数来引入短的uniq字符串ID。
示例当用户指向www.something.com/SjBWY - > php将获取id = 23511;
的记录我想要隐藏有关问题数量的信息,并使用某种翻译算法引入问题代码,该问题代码将1对1映射到question_id。 我不想将question_code存储在数据库中,我相信MySQL开发人员比我聪明,并且已经创建了可靠的机制来生成uniq数字。
天真的方法:(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
问题:您能否提出更好的解决方案?
Naive aproche的弱点:
修改 算法应该是对称的意思是我可以翻译Int-> String和String-> Int。 MD5和其他哈希算法只是单向,我无法从String-> Int
转换答案 0 :(得分:4)
终于找到了我要找的东西。它被称为: http://www.hashids.org/它有php,java,nodejs,ruby,.net等版本。
Hashids旨在用于URL缩短,跟踪内容, 验证帐户或将页面设为私有(通过抽象)。 您可以将它们显示为,而不是将项目显示为1,2或3 b9iLXiAa,EATedTBy和Aaco9cy5。哈希值取决于您的盐值。
答案 1 :(得分:1)
由于可能发生碰撞,散列不是一个好选择。你需要什么样的双射变换。
例如,您可以加密ID ...
(可选)使用6位块和字符映射(例如[a-zA-Z0-9 _-])对结果位字符串进行base64编码或其他操作。
无论您做什么,请确保您可以轻松地进行逆向转换。
答案 2 :(得分:0)
为什么不将uniq字符串ID转换为字节然后转换为long / int? 要转换回来将long / int转换为字节然后转换为字符串....