4

我想使用带有 Auto Incr 的 MySQL 表字段 (question_id) 中的整数引入短 uniq 字符串 ID。

示例当用户指向 www.something.com/SjBWY -> php 将获取 id=23511 的记录;

我想隐藏有关问题数量的信息,并使用某种翻译算法将 question_code 以 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

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

幼稚的弱点:

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

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

4

3 回答 3

4

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

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

于 2013-06-25T11:15:13.033 回答
1

由于潜在的冲突,散列不是一个好的选择。你需要一个双射变换。

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

可选地,base64 编码生成的位串,或使用 6 位块和字符映射(例如 [a-zA-Z0-9_-])实现该效果的东西。

无论您做什么,请确保您可以相当容易地进行反向转换。

于 2013-06-02T16:27:01.713 回答
0

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

于 2013-06-02T19:36:29.697 回答