繁体   English   中英

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

[英]Symmetric algorithm to convert integer ID to String

我想用MySQL表格字段(question_id)中的整数和Auto Incr引入短的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

问:你能提出更好的解决方案吗?

天真的aproche弱点:

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

编辑算法应该是对称的意思是我可以翻译Int-> String和String-> Int。 MD5和其他哈希算法只是一种方式 ,我无法从String-> Int转换

终于找到了我想要的东西。 它被称为: http//www.hashids.org/它有php,java,nodejs,ruby,.net等版本。

Hashids旨在用于URL缩短,跟踪内容,验证帐户或将页面设为私有(通过抽象)。 您可以将它们显示为b9iLXiAa,EATedTBy和Aaco9cy5,而不是将项目显示为1,2或3。 哈希值取决于您的盐值。

由于可能发生碰撞,散列不是一个好的选择。 你需要什么样的双射变换。

例如,您可以加密ID ...

(可选)使用6位块和字符映射(例如[a-zA-Z0-9_-])对结果位字符串进行base64编码或其他操作。

无论您做什么,请确保您可以轻松地进行逆向转换。

为什么不将uniq字符串ID转换为字节然后再转换为long / int? 要转换回来将long / int转换为字节然后转换为字符串....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM