UUID[1]是软件开发中最常用的通用标识符之一。然而,在过去几年中,新的替代品对其存在提出了挑战。其中,ULID是领先的竞争者之一,因为它提供可排序的唯一ID。在本文中,我将通过示例讨论ULID的特性,以便您更好地理解何时使用它。了解ULID及其用法ULID[2]代表通用唯一字母标识符。它每周有超过271,000次NPM下载和1.7KGitHubStars。您可以轻松安装ULIDNPM库,并使用npmiulid命令在您的项目中使用它。从'ulid'导入{ulid};ulid();它有一些惊人的特性,解决了UUID的一些缺点。例如,在关系数据库中使用UUID时,由于缺乏内置排序,数据索引可能会出现困难。在这种情况下,您可能被迫包含另一个属性以使数据可排序。此外,UUID在随机性、效率和生成方面存在一些常见问题,ULID解决了这些问题。因此,让我们仔细看看ULID。同时使用时间戳和随机性当你使用UUID生成ID时,它只会考虑随机性或时间戳,生成一个36个字符的长字符串。然而,ULID在生成ID时同时考虑了随机性和时间戳,并将它们编码为26个字符串(128位)。//UUID示例01FHZXHK8PTP9FVK99Z66GXQTXULID的前10个字符代表时间戳,ULID的第二部分代表随机性。两部分都是base32编码字符串,分别使用48位和80位表示。例如,上述ULID的细分如下所示:01FHZXHK8PTP9FVK99Z66GXQTX时间戳(48位)-01FHZXHK8PNonce(80位)-TP9FVK99Z66GXQTX注意:ULID使用Crockford的Base32字母表(0123456789ABCDEFGHJKMNPZQRSTVWYX)进行编码。它不包括I、L、O和U字母,以避免任何意外混淆。UILD是按字典顺序排序的字典可排序性是ULID最突出的特征之一。我们已经知道,ULID是可以排序的。ULID的这一特性使开发人员可以轻松地管理与数据库相关的任务,例如排序、分区和索引。例如,您不需要创建额外的列来维护记录的创建时间。相反,您可以使用ULID的时间戳表示来根据创建时间对数据进行排序或分区。注意:ULID的时间戳部分以UNIX时间表示,以毫秒为单位,直到10889AD空间用完为止。随机数的高安全性大多数随机ID生成器使用unsafeMath.random()来生成ID。但是,ULID默认阻止使用Math.random()并根据情况自动决定合适的随机数生成器。比如它会在浏览器中使用crypto.getRandomValues,在Node环境中使用crypto.randomBytes。但是,如果您想在ULID中使用Math.random(),则需要明确允许该权限。import{factory,detectPrng}from'ulid'constrandom_number_gen=detectPrng(true)constulid=factory(random_number_gen)注意:您也可以使用自己的伪随机数生成器来生成ULID。具有种子时间的单调ULIDULID允许您通过传递种子时间来获取具有相同时间戳的ID。例如,如果要创建时间戳为2021-10-15的ID,则需要将UNIX时间戳(以毫秒为单位)传递给ulid()函数。ulid(1634263671000)//01FJ0V986RA01G70YQ5Z0AMQE7除其他事项外,ULID允许创建一系列具有递增值的ID。您需要做的就是使用monotonicFactory创建一个ulid对象并传递相同的时间种子。import{monotonicFactory}from'ulid'constulid=monotonicFactory()console.log(ulid(100000));//00000031N0J7R2B57M8YG73J7Mconsole.log(ulid(100000));//00000031N0J7R2B57M0N0Gole(100000)1日志(0//0J7R2B57M0N0G73J7)00000031N0J7R2B57M8YG73J7Pconsole.log(ulid(100000));//00000031N0J7R2B57M8YG73J7Qconsole.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+Modulesimport{ulid}from'ulid';ulid();//CommonJSconstULID=require('ulid');ULID.ulid();//AMDdefine(['ULID'],function(ULID){ULID.ulid()});//浏览器其他特征每毫秒可以生成1.21e+24个唯一的ULID。ULID是URL安全的,因为它不使用任何特殊字符。小包大小-2.5kB(缩小),1.2kB(GZipped)。下载时间约为1ms–10ms。比UUID短。兼容UUID128格式。未来亮点根据StackOverflow的许多专家的说法,使用ULID没有明显的缺点或限制。但是,不区分大小写和80位随机性是开发人员在ULID中注意到的主要缺点。但它的字典排序能力使它与众不同。另外,如果我们考虑过去一年ULID的使用趋势,我们可以看到它正在上升。虽然它的下载量远少于UUID,但它在过去一年中获得了超过150,000名用户。https://www.npmtrends.com/ulid有了所有这些功能以及我在UUID和ULID方面的经验,对于需要排序的用例来说,这是一个明智的选择。所以,请不要犹豫,在您的下一个项目中使用ULID。原文:https://blog.bitsrc.io/ulid-vs-uuid-sortable-random-id-generators-for-javascript-183400ef862c作者:ChameeraDulanga参考文献[1]UUID:https://en.wikipedia。org/wiki/Universally_unique_identifier[2]ULID:https://www.npmjs.com/package/ulid本文转载自微信公众号“前端全栈开发者”,可通过以下二维码关注.转载本文请联系前端全栈开发公众号。
