【问题标题】:Best way to implement alphanumeric id实现字母数字 id 的最佳方法
【发布时间】:2010-02-22 19:29:39
【问题描述】:

我注意到短 URL 网站使用字母数字 id 而不是整数作为 unqiue id。

有人有实施经验吗?在 MySQL 中实现此功能的最佳方法是什么?我相信棘手的部分可能是 id 的增量和索引。

示例:bit.ly/AbC123

【问题讨论】:

标签: sql mysql


【解决方案1】:

我怀疑这些字母数字 ID 中的大多数只是转换为 Base 36 的数字 ID - 请参阅此示例 stored function,或者您可以使用 UDF 来实现。

【讨论】:

    【解决方案2】:

    老实说,如果您必须使用字母数字序列,我只会在内部使用整数,然后转换为字母数字以向用户公开。作为示例编码方案,您可以将每个数字用作数组的索引,该数组由从 A 到 J(对应于 0 到 9)的字母组成。

    一般来说,整数是更好的唯一 ID,因为它们占用的内存更少,而且更容易被索引。

    【讨论】:

      【解决方案3】:

      我会单独生成散列,但为主键维护一个整数(或 BIGINT)列。 MySQL 最适合使用较小的主键,尤其是 InnoDB。

      例如:

      CREATE TABLE `urls` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `hash` char(6) NOT NULL,
        `url` varchar(1000) NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `uk_hash` (`hash`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      

      编辑:要生成哈希,请参阅 this SO post 了解 base62 转换器实现。

      【讨论】:

        【解决方案4】:

        如果您不关心 ID 的长度,请考虑使用UUID()

        服务器端编程语言也有多种方式,例如 PHP 中的 uniqid 或 Perl 中的 Data::UUID

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 2011-12-18
          • 1970-01-01
          • 2021-11-11
          相关资源
          最近更新 更多