轻识Logo
目录

    ULID 与 UUID:用于 JavaScript 的可排序随机 ID 生成器

    UUID[1] 是软件开发中最常用的通用标识符之一。然而,在过去的几年里,新的替代品挑战了它的存在。

    其中,ULID 是领先的竞争对手之一,因为它提供可排序的唯一 ID。

    在本文中,我将通过示例讨论 ULID 的特性,以便您更好地了解何时使用它。


    了解 ULID 及其用法

    ULID[2] 代表通用唯一按字母顺序排序的标识符。它每周有超过 271K 的 NPM 下载和 1.7K 的 GitHub Stars。

    您可以使用 npm i ulid 命令轻松安装 ULID NPM 库并在您的项目中使用它。

    import { ulid } from ‘ulid’;
    ulid();

    它具有一些惊人的功能,解决了UUID的一些缺点。例如,当在关系数据库中使用UUID时,由于缺乏内置的排序,可能会出现数据索引的困难。在这种情况下,你可能被迫包括另一个属性来使数据可排序。

    此外,UUID 在随机性、效率和生成方面存在一些常见问题,ULID 解决了这些问题。因此,让我们详细了解一下 ULID。

    同时使用时间戳和随机性

    当你使用UUID生成一个ID时,它将只考虑随机性或时间戳,生成一个36个字符的长字符串。

    但是,ULID 会同时考虑随机性和时间戳来生成 ID,并将它们编码为 26 个字符串(128 位)。

    // UUID示例
    01FHZXHK8PTP9FVK99Z66GXQTX

    ULID 的前 10 个字符表示时间戳,ULID 的第二部分表示随机性。这两个部分都是 base 32 编码字符串,分别使用 48 位和 80 位表示。

    例如,上述 ULID 的分解如下所示:

    01FHZXHK8PTP9FVK99Z66GXQTX
    时间戳 (48 bits) - 01FHZXHK8P
    随机数 (80 bits) - TP9FVK99Z66GXQTX

    注意:ULID 使用 Crockford 的 Base32 字母表 (0123456789ABCDEFGHJKMNPQRSTVWXYZ) 进行编码。它不包括 I、L、O 和 U 字母以避免任何意外的混淆。

    UILD 是按字典顺序排序的

    词典可排序性是 ULID 最突出的特性之一。

    正如我们已经知道的,ULID 可以排序。ULID 的这一特性允许开发人员轻松管理与数据库相关的任务,例如排序、分区和索引。

    例如,你不需要创建一个额外的列来维护记录的创建时间。相反,你可以使用ULID的时间戳表示,根据创建时间来排序或划分数据。

    注意:ULID 的时间戳部分以 UNIX 时间(以毫秒为单位)表示,直到公元 10889 年才会耗尽空间。

    随机数的高安全性

    大多数随机 ID 生成器使用 unsafeMath.random() 来生成 ID。但是,ULID 默认阻止使用 Math.random() 并根据情况自动决定合适的随机数生成器。

    例如,它将在浏览器中使用 crypto.getRandomValues,在 Node 环境中使用 crypto.randomBytes

    但是,如果您想在 ULID 中使用 Math.random(),则需要明确允许该权限。

    import { factory, detectPrng } from 'ulid'

    const random_number_gen = detectPrng(true)
    const ulid = factory(random_number_gen)

    注意:您也可以使用自己的伪随机数生成器来生成 ULID。

    单调的ULIDs与种子时间

    ULID 允许您通过传递种子时间来获取具有相同时间戳的 ID。例如,如果要创建以 2021–10–15 作为时间戳的 ID,则需要将 UNIX 时间戳(以毫秒为单位)传递给 ulid() 函数。

    ulid(1634263671000) // 01FJ0V986RA01G70YQ5Z0AMQE7

    除此之外,ULID 允许创建一系列值不断增加的 ID。您需要做的就是使用 monotonicFactory 创建一个 ulid 对象并传递相同的时间种子。

    import { monotonicFactory } from ‘ulid’
    const ulid = monotonicFactory()
    console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7M
    console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7N
    console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7P
    console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7Q
    console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7R

    多语言支持

    ULID 支持近 50 种语言,包括 JavaScript、Java、C++、Dart、Python 和 .NET。

    此外,二进制表示可用于超过 15 种语言,包括 C++、Dart、Go、JavaScript 和 Python。

    JavaScript 模块支持

    ULID 可以轻松地与所有类型的 JavaScript 模块一起使用,包括 ES6+、CommonJS 和 AMD。

    // TypeScript , ES6+ Modules
    import { ulid } from ‘ulid’;
    ulid();

    // CommonJS
    const ULID = require('ulid');
    ULID.ulid();

    // AMD
    define(['ULID'] , function (ULID) {
    ULID.ulid()
    });

    // Browser
    <script src="https://unpkg.com/ulid@2.3.0/dist/index.umd.js">script>
    <script>
    ULID.ulid()
    script>

    其他特性

    1. 每毫秒可以生成 1.21e+24 个唯一的 ULID。
    2. ULID 是 URL 安全的,因为它不使用任何特殊字符。
    3. 小包大小 - 2.5 kB (minified), 1.2kB (GZipped).
    4. 下载时间约为 1ms –10 ms。
    5. 比 UUID 短。
    6. 与 UUID 128 格式兼容。

    未来重点

    根据 StackOverflow 中的许多专家意见,使用 ULID 没有明显的缺点或限制。

    但是,不区分大小写和 80 位随机性是开发人员在 ULID 中注意到的主要缺点。但它的字典排序能力使其在所有其他产品中独树一帜。

    此外,如果我们考虑过去一年 ULID 的使用趋势,我们可以看到它处于上升趋势。虽然下载量比 UUID 少很多,但在过去的一年里它已经获得了超过 150000 名用户。

    https://www.npmtrends.com/ulid

    凭借所有这些功能以及我使用 UUID 和 ULID 的经验,对于需要排序的用例来说,这是不费吹灰之力的。所以,不要犹豫,在你的下一个项目中使用 ULID。

    最新发布
    • Vue.js + Astro 比 Vue SPA 更好吗?
    • 使用 node-config 在 Node.js 中创建配置文件
    • Flutter 2021 中的按钮

    原文:https://blog.bitsrc.io/ulid-vs-uuid-sortable-random-id-generators-for-javascript-183400ef862c
    作者:Chameera Dulanga

    参考资料

    [1]

    UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier

    [2]

    ULID: https://www.npmjs.com/package/ulid

    浏览 91
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报
    ULID - 一种比UUID更好的方案
    码农突围
    0
    6 个用于排序数组的 JavaScript 代码片段
    web前端开发
    0
    JavaScript 生成器的简介
    web前端开发
    0
    Java UUID GeneratorUUID 生成器
    JUG是一个纯Java的UUID生成器。UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准
    Java UUID GeneratorUUID 生成器
    0
    分布式ID生成器(CosId)的设计与实现
    Java资料站
    0
    Java UUID GeneratorUUID 生成器
    JUG 是一个纯 Java 的 UUID 生成器。UUID是指在一台机器上生成的数字,它保证对在同一
    Java UUID GeneratorUUID 生成器
    0
    Chance随机字符串生成器
    Chance 是一个最小化的随机字符串生成器,可帮助减少编写单调的代码,特别是在编写自动化测试时经常
    Chance随机字符串生成器
    0
    Chance随机字符串生成器
    Chance是一个最小化的随机字符串生成器,可帮助减少编写单调的代码,特别是在编写自动化测试时经常需要各种随机内容。
    Chance随机字符串生成器
    0
    关于 JavaScript Object.keys() 排序问题的探索与总结
    程序员成长指北
    0
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报

    两个鬼故事姓韩字起名重生传说周行文孩子起乳名宝宝起名浩啥好听男大庭广众xxxmovie艾宝宝起名食品公司起名字世界上最恐怖的作文光电科技公司起名中银活期宝起名字女孩姓名黄网游之倒行逆施香河别墅范和王起名快餐加盟店名酒店取名起名大全三年级清风一吹他们就怎么样个体户名字怎么起400选号玫瑰产品起名谢姓起名字男打女人屁股新生儿起名大全男宝熏酱小酒馆起名冬月初四吉字起名起名景的字hd网严峻大师起名字怎么样少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

    两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化