【问题标题】:Symmetric algorithm to convert integer ID to String将整数 ID 转换为字符串的对称算法
【发布时间】:2013-06-25 19:15:13
【问题描述】:

我想使用带有 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

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

幼稚的aproche弱点:

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

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

翻译

【问题讨论】:

  • 为什么不直接使用像 MD5 这样的散列算法?
  • 使用散列算法将标签映射到短字符串,并且(如果您愿意)将字符串中的字节解释为整数
  • 散列可能是更好的选择...
  • 散列只是一种方式。
  • @IgorS。只需将每个字母映射到它的 ascii 代码并将它们连接起来就很容易了,然后你就可以轻松地来回走动了。

标签: php mysql algorithm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-12-01
        • 2015-03-21
        • 1970-01-01
        • 2018-05-02
        • 2012-10-22
        • 2012-02-21
        • 2010-12-31
        相关资源
        最近更新 更多