将整数ID转换为String的对称算法

时间:2013-06-02 13:55:24

标签: php mysql algorithm

我想使用带有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的弱点:

  • 我希望能够使用小字母和大字母
  • 我希望能够尽可能长地将字符串长度限制为5。
  • 在生成的字符串中不应该是明显的序列。 11的值应该尽可能从12。

修改 算法应该是对称的意思是我可以翻译Int-> String和String-> Int。 MD5和其他哈希算法只是单向,我无法从String-> Int

转换

3 个答案:

答案 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转换为字节然后转换为字符串....