<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sean Maxwell</title>
    <description>The latest articles on DEV Community by Sean Maxwell (@spmaxwell7).</description>
    <link>https://dev.to/spmaxwell7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4132192%2F81cb6955-d2dd-4717-917e-9e95dc564fe4.png</url>
      <title>DEV Community: Sean Maxwell</title>
      <link>https://dev.to/spmaxwell7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spmaxwell7"/>
    <language>en</language>
    <item>
      <title>I built a unique ID generator that's ~60% faster than nanoid</title>
      <dc:creator>Sean Maxwell</dc:creator>
      <pubDate>Sat, 19 Sep 2026 17:37:39 +0000</pubDate>
      <link>https://dev.to/spmaxwell7/i-built-a-unique-id-generator-thats-60-faster-than-nanoid-1aan</link>
      <guid>https://dev.to/spmaxwell7/i-built-a-unique-id-generator-thats-60-faster-than-nanoid-1aan</guid>
      <description>&lt;p&gt;&lt;strong&gt;jet-id&lt;/strong&gt; is a tiny, zero-dependency unique ID generator for JavaScript and TypeScript. IDs are 28-character Crockford base32 strings, with optional timestamps so they sort by creation time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jetId&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jet-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// '9Q8SWWBTY-7NVXM-FT9S6-XB4R3M'&lt;/span&gt;
&lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// '1KKNTQ2CN-606ZG-8VF48-76B6F3'  (sorts by creation time)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/seanpmaxwell" rel="noopener noreferrer"&gt;
        seanpmaxwell
      &lt;/a&gt; / &lt;a href="https://github.com/seanpmaxwell/jet-id" rel="noopener noreferrer"&gt;
        jet-id
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An extremely fast unique ID generator for JavaScript and TypeScript, with optional sorting/timestamping.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;jet-id&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/jet-id" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/76581b732f975b2cf4ed4383ccecc27efcf0537e6b02521ea88ad9ff3bdc2f91/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6a65742d69643f7374796c653d666c61742d737175617265266c6f676f3d6e706d266c6f676f436f6c6f723d776869746526636f6c6f723d636233383337" alt="npm"&gt;&lt;/a&gt;
&lt;a href="https://github.com/seanpmaxwell/jet-id/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20525214c1f31ffb8f6a8c4358242aae04b9ba4734a794f11d4c7d45395180f0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7365616e706d617877656c6c2f6a65742d69642f63692e796d6c3f7374796c653d666c61742d737175617265266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d4349" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/seanpmaxwell/jet-id/blob/main/src/index.ts" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8768397a19d6de2dd6dc24a4c3b74a02166ec6122e91777070de96effa071e75/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74797065732d696e636c756465642d3331373863363f7374796c653d666c61742d737175617265266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="types"&gt;&lt;/a&gt;
&lt;a href="https://github.com/seanpmaxwell/jet-id/blob/main/package.json" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d431deb0ced8f949333790c1b7f07d65ef0baeb9bd4b4ca13aaebff05cd3b8df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d3434636331313f7374796c653d666c61742d737175617265" alt="dependencies"&gt;&lt;/a&gt;
&lt;a href="https://github.com/seanpmaxwell/jet-id/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265" alt="license"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An extremely fast unique ID generator for JavaScript and TypeScript, with optional sorting/timestamping.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Glance&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-ts notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;jetId&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'jet-id'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-en"&gt;jetId&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt; &lt;span class="pl-c"&gt;// '9Q8SWWBTY-7NVXM-FT9S6-XB4R3M'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Every ID is 25 random characters from the Crockford base32 alphabet, split into groups of 9-5-5-6.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why jet-id?&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Main features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optionally timestamped and readable:&lt;/strong&gt; Generated IDs are 28-character strings (25 Crockford characters plus 3 dashes). The first segment is 9 characters; if you want a timestamp, the first segment encodes the current epoch in Crockford form, so the ID length stays the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast:&lt;/strong&gt; Faster than &lt;code&gt;nanoid()&lt;/code&gt;. &lt;a href="https://github.com/seanpmaxwell/jet-id#benchmarks" rel="noopener noreferrer"&gt;See benchmarks&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Other perks&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small:&lt;/strong&gt; Only &lt;strong&gt;6.4 kB&lt;/strong&gt; packed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong randomness:&lt;/strong&gt; 125 random bits. For perspective, UUID v4 has 122.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero runtime dependencies.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple API:&lt;/strong&gt; Just &lt;code&gt;jetId()&lt;/code&gt; and &lt;code&gt;jetId.test&lt;/code&gt;/&lt;code&gt;jetId.timed&lt;/code&gt;/&lt;code&gt;jetId.parseTimed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal:&lt;/strong&gt; Works in Node.js and modern browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install jet-id&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;API&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Basic usage&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Just call the default import, there…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/seanpmaxwell/jet-id" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~83 million IDs/sec&lt;/strong&gt;, vs. nanoid's ~52 million on my machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;125 random bits&lt;/strong&gt; from &lt;code&gt;crypto.getRandomValues&lt;/code&gt; (UUID v4 has 122)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable:&lt;/strong&gt; the Crockford alphabet has no &lt;code&gt;I&lt;/code&gt;, &lt;code&gt;L&lt;/code&gt;, &lt;code&gt;O&lt;/code&gt;, or &lt;code&gt;U&lt;/code&gt; to confuse with &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small:&lt;/strong&gt; zero dependencies, 6.4 kB packed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal:&lt;/strong&gt; runs in Node.js and modern browsers, and there's a CLI too&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;I was looking for an ID generator for a web project (mostly for a database column) that used the Crockford alphabet and had optional timestamping. I couldn't find anything that quite fit, so I debated between wrapping nanoid and writing my own. It seemed like a fun project that probably just involved some simple arithmetic (or so I naively thought), so I wrote my own.&lt;/p&gt;

&lt;p&gt;The first version took a morning. Then, out of curiosity, I fed it to &lt;strong&gt;Fable 5.1&lt;/strong&gt; and &lt;strong&gt;GPT Astra&lt;/strong&gt;, and I was blown away. They introduced me to techniques I didn't know existed, like pooling, lookup tables, and bit-shifting. I spent the next two days passing it back and forth between them, benchmarking every change, rolling back anything that got slower, and adding my own tweaks in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it fast
&lt;/h2&gt;

&lt;p&gt;Most of the speed comes from doing expensive work rarely and in bulk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pooling.&lt;/strong&gt; IDs are built 256 at a time into a single string, so most calls to &lt;code&gt;jetId()&lt;/code&gt; are just a &lt;code&gt;substring&lt;/code&gt;. One &lt;code&gt;crypto.getRandomValues&lt;/code&gt; call supplies enough randomness for 1,024 IDs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two characters per lookup.&lt;/strong&gt; A 1,024-entry table turns 10 random bits into two Crockford characters at once, instead of encoding one character at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four bytes at a time.&lt;/strong&gt; Each 28-character ID is written as seven 32-bit words through a &lt;code&gt;Uint32Array&lt;/code&gt;, dashes included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One string conversion per chunk.&lt;/strong&gt; The bytes are decoded to a string once (through &lt;code&gt;Buffer&lt;/code&gt; in Node, &lt;code&gt;TextDecoder&lt;/code&gt; in browsers), and every ID is sliced from it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benchmarks
&lt;/h2&gt;

&lt;p&gt;On my MacBook M4 Pro (Node 24), median of 7 samples of at least 500 ms each, after a 500 ms warmup:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generator&lt;/th&gt;
&lt;th&gt;Chars&lt;/th&gt;
&lt;th&gt;Random bits&lt;/th&gt;
&lt;th&gt;Ops/sec&lt;/th&gt;
&lt;th&gt;Relative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jetId()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;83,503,288&lt;/td&gt;
&lt;td&gt;1.00x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nanoid()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;52,415,897&lt;/td&gt;
&lt;td&gt;0.63x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nanoid, Crockford, 25 chars&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;47,073,761&lt;/td&gt;
&lt;td&gt;0.56x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nanoid, Crockford, 9-5-5-6&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;14,441,127&lt;/td&gt;
&lt;td&gt;0.17x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crypto.randomUUID()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;9,938,321&lt;/td&gt;
&lt;td&gt;0.12x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;uuid&lt;/code&gt; v4&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;8,536,998&lt;/td&gt;
&lt;td&gt;0.10x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's roughly 60% faster than nanoid's defaults, even though jet-id's IDs are longer (28 characters vs. 21). Configured to produce the same &lt;code&gt;9-5-5-6&lt;/code&gt; format, nanoid is about 6x slower. To be fair, nanoid isn't built for dash-separated output, so part of that gap is the formatting wrapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 9-5-5-6?
&lt;/h2&gt;

&lt;p&gt;It looks a bit different, but it isn't arbitrary. The first segment is 9 characters because that's how long the current epoch (in milliseconds) is in Crockford base32, which leaves room for the optional timestamp without changing the ID's length. I wanted at least UUID v4's entropy, which takes 25 random characters, and splitting the remaining 16 into 5-5-6 seemed the most readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timestamped IDs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;jetId.timed()&lt;/code&gt; encodes the current time in the first nine characters, so plain string sorting is creation order. You can also pass your own epoch in milliseconds, and &lt;code&gt;jetId.parseTimed()&lt;/code&gt; reads it back out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;UTC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// '19GAS9400-...'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// '1KKNTQ2CN-606ZG-8VF48-76B6F3'&lt;/span&gt;
&lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseTimed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// 1773480413589&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseTimed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 2026-03-14T09:26:53.589Z&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two tradeoffs to know about: timestamped IDs spend those first 9 characters on the time, so they carry 80 random bits instead of 125, and IDs created in the same millisecond have no defined order between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validating IDs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;jetId.test()&lt;/code&gt; checks whether a value is a well-formed ID. It isn't case-sensitive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;jetId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avz6yg1rb-47j6r-xgns9-tqw29a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  From the command line
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx jet-id          &lt;span class="c"&gt;# one random ID&lt;/span&gt;
npx jet-id &lt;span class="nt"&gt;-c&lt;/span&gt; 5     &lt;span class="c"&gt;# five, one per line&lt;/span&gt;
npx jet-id &lt;span class="nt"&gt;-t&lt;/span&gt;       &lt;span class="c"&gt;# one timestamped ID&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;These benchmarks were all done on my local machine using the &lt;a href="https://github.com/seanpmaxwell/jet-id/blob/main/playground/benchmark.ts" rel="noopener noreferrer"&gt;&lt;code&gt;playground/benchmark.ts&lt;/code&gt;&lt;/a&gt; script. If they're different for you, or if you know of something faster, feedback is very welcome, especially if there's a flaw in the way I did the benchmarking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/seanpmaxwell/jet-id" rel="noopener noreferrer"&gt;https://github.com/seanpmaxwell/jet-id&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/jet-id" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/jet-id&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
