<?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: Louis Franck M</title>
    <description>The latest articles on DEV Community by Louis Franck M (@louis_franckm_2c5016864a).</description>
    <link>https://dev.to/louis_franckm_2c5016864a</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3816310%2F63881f18-a3bc-4511-aaee-e948cc53bdac.png</url>
      <title>DEV Community: Louis Franck M</title>
      <link>https://dev.to/louis_franckm_2c5016864a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/louis_franckm_2c5016864a"/>
    <language>en</language>
    <item>
      <title>Designing a topology-aware UUID v8-style Java library for distributed systems</title>
      <dc:creator>Louis Franck M</dc:creator>
      <pubDate>Mon, 04 May 2026 10:28:23 +0000</pubDate>
      <link>https://dev.to/louis_franckm_2c5016864a/designing-a-topology-aware-uuid-v8-style-java-library-for-distributed-systems-2525</link>
      <guid>https://dev.to/louis_franckm_2c5016864a/designing-a-topology-aware-uuid-v8-style-java-library-for-distributed-systems-2525</guid>
      <description>&lt;p&gt;Most ID libraries solve one problem well:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uniqueness&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But in distributed systems, that is often not enough.&lt;/p&gt;

&lt;p&gt;Sometimes you also want an identifier to help with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;- ordering&lt;/li&gt;
&lt;li&gt;- tracing&lt;/li&gt;
&lt;li&gt;- debugging&lt;/li&gt;
&lt;li&gt;- understanding where it came from&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is why I built &lt;strong&gt;EUID&lt;/strong&gt;, a Java library for generating &lt;strong&gt;sortable, decodable, topology-aware UUID v8-style identifiers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;v0.2.0&lt;/strong&gt;, I made the biggest change to the project so far: I split generation into &lt;strong&gt;two strategies&lt;/strong&gt; instead of forcing one implementation to handle every workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why EUID exists&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional UUIDs are great when you want opaque, globally unique values.&lt;/p&gt;

&lt;p&gt;But they do not help much when your system also cares about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;time ordering&lt;/li&gt;
&lt;li&gt;infrastructure visibility&lt;/li&gt;
&lt;li&gt;decoding metadata from an ID&lt;/li&gt;
&lt;li&gt;understanding distributed generation behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EUID is designed for those cases.&lt;/p&gt;

&lt;p&gt;It uses a structured 128-bit layout with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;li&gt;region&lt;/li&gt;
&lt;li&gt;shard&lt;/li&gt;
&lt;li&gt;node&lt;/li&gt;
&lt;li&gt;sequence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the ID is not just unique — it can also be decoded and understood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in v0.2.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest change in &lt;strong&gt;v0.2.0&lt;/strong&gt; was the generator model.&lt;/p&gt;

&lt;p&gt;Instead of one generation strategy, EUID now provides two:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FastEuidGenerator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;single-threaded use&lt;/li&gt;
&lt;li&gt;thread-confined use&lt;/li&gt;
&lt;li&gt;minimal overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ConcurrentEuidGenerator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shared concurrent use&lt;/li&gt;
&lt;li&gt;multi-threaded access to the same generator&lt;/li&gt;
&lt;li&gt;better scalability under contention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the library much more honest.&lt;/p&gt;

&lt;p&gt;Different workloads do not always need the same generator behavior, so the API now reflects that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast generator&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;EuidGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Concurrent generator&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;EuidGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concurrent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Concurrent generator with custom block size&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;EuidGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concurrent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Decode support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the key goals of EUID is that IDs should be useful to inspect.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;DecodedEuid&lt;/span&gt; &lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidDecoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstant&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRegion&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getShard&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNode&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSequence&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debugging distributed systems&lt;/li&gt;
&lt;li&gt;tracing event origins&lt;/li&gt;
&lt;li&gt;validating routing or sharding behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Base58 support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EUID also supports Base58 encoding for more compact external representation.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidBase58Codec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="no"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidBase58Codec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is useful when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shorter IDs&lt;/li&gt;
&lt;li&gt;better readability&lt;/li&gt;
&lt;li&gt;easier copy/paste in logs or URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benchmarks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;v0.2.0&lt;/strong&gt;, I also created a separate JMH benchmark project and benchmarked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw generation&lt;/li&gt;
&lt;li&gt;multi-thread throughput&lt;/li&gt;
&lt;li&gt;generation + toString()&lt;/li&gt;
&lt;li&gt;Base58 encoding/decoding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Highlights for euid-core:0.2.0&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raw generation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; * ConcurrentEuidGenerator: ~262.8M ops/s&lt;/li&gt;
&lt;li&gt; * FastEuidGenerator: ~254.8M ops/s&lt;/li&gt;
&lt;li&gt; * tested UUID v7 library: ~68.4M ops/s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Multi-thread&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; * FastEuidGenerator (per thread): ~850.7M ops/s&lt;/li&gt;
&lt;li&gt; * ConcurrentEuidGenerator (per thread): ~848.2M ops/s&lt;/li&gt;
&lt;li&gt; * ConcurrentEuidGenerator (shared): ~826.3M ops/s&lt;/li&gt;
&lt;li&gt; * tested UUID v7 library: ~39.6M ops/s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Generate + toString()&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; * FastEuidGenerator: ~68.5M ops/s&lt;/li&gt;
&lt;li&gt; * ConcurrentEuidGenerator: ~59.8M ops/s&lt;/li&gt;
&lt;li&gt; * tested UUID v7 library: ~40.2M ops/s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Base58&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; * encode: ~1.4M to ~1.5M ops/s&lt;/li&gt;
&lt;li&gt; * decode: ~2.07M ops/s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark results helped clarify an important point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; * raw generation is very fast&lt;/li&gt;
&lt;li&gt; * string conversion changes the overall picture&lt;/li&gt;
&lt;li&gt; * Base58 is useful, but comes with a real cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few things became clear while working on this release:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;One generator strategy was not enough&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different workloads genuinely benefit from different generation models.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Benchmarking needs discipline&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Focused JMH runs gave much more meaningful results than broad mixed runs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IDs can be operational tools&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For some systems, an ID that carries structure is more useful than a purely opaque value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When EUID makes sense&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EUID is a good fit if you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sortable IDs&lt;/li&gt;
&lt;li&gt;topology-aware IDs&lt;/li&gt;
&lt;li&gt;decode support&lt;/li&gt;
&lt;li&gt;strong throughput&lt;/li&gt;
&lt;li&gt;more operational visibility from identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is probably not the right choice if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you only need random uniqueness&lt;/li&gt;
&lt;li&gt;you want fully opaque IDs&lt;/li&gt;
&lt;li&gt;UUID v4 or UUID v7 already fully solves your use case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EUID is not trying to replace every UUID scenario.&lt;/p&gt;

&lt;p&gt;It is aimed at systems that benefit from &lt;strong&gt;sortable, decodable, infrastructure-aware identifiers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current status&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is currently at &lt;strong&gt;v0.2.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At this stage, I am more focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;benchmark communication&lt;/li&gt;
&lt;li&gt;API clarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;than rushing to &lt;strong&gt;1.0.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I would rather have a well-understood &lt;strong&gt;0.2.x&lt;/strong&gt; than a premature “stable” release.&lt;/p&gt;

&lt;p&gt;Feedback welcome&lt;/p&gt;

&lt;p&gt;I’d be very interested in feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the API design&lt;/li&gt;
&lt;li&gt;the benchmark methodology&lt;/li&gt;
&lt;li&gt;tradeoffs vs UUID v7&lt;/li&gt;
&lt;li&gt;tradeoffs vs Snowflake-style IDs&lt;/li&gt;
&lt;li&gt;real distributed-system use cases&lt;/li&gt;
&lt;/ul&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/louis-franck-moussima" rel="noopener noreferrer"&gt;
        louis-franck-moussima
      &lt;/a&gt; / &lt;a href="https://github.com/louis-franck-moussima/euid-java" rel="noopener noreferrer"&gt;
        euid-java
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Core library for EUID — a fast, distributed, sortable unique ID generator for Java.
    &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;EUID — Topology-Aware UUID v8 for Java&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/919aef7d47ce5d55ec2756e9ac122638a3bfeabdea540e8bc815cc08ee96e228/68747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d63656e7472616c2f762f696f2e6769746875622e6c6f7569732d6672616e636b2d6d6f757373696d612f657569642d636f7265"&gt;&lt;img src="https://camo.githubusercontent.com/919aef7d47ce5d55ec2756e9ac122638a3bfeabdea540e8bc815cc08ee96e228/68747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d63656e7472616c2f762f696f2e6769746875622e6c6f7569732d6672616e636b2d6d6f757373696d612f657569642d636f7265" alt="Maven Central"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/39a434c39c97856247fc55ebc90e8cc1cb9871558a37bf1bf83cbaca3be89d69/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/39a434c39c97856247fc55ebc90e8cc1cb9871558a37bf1bf83cbaca3be89d69/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c7565" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/094f92a4bdd84ca94c0929a50ebaaf1e5430edbf73eda6259b9f3203134ba18e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6176612d31372b2d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/094f92a4bdd84ca94c0929a50ebaaf1e5430edbf73eda6259b9f3203134ba18e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6176612d31372b2d6f72616e6765" alt="Java"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EUID&lt;/strong&gt; is a Java library for generating &lt;strong&gt;sortable, decodable, infrastructure-aware UUID v8 identifiers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is designed for distributed systems that need more than raw uniqueness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;time-ordered IDs&lt;/strong&gt; for better database locality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;embedded topology metadata&lt;/strong&gt; (&lt;code&gt;region&lt;/code&gt;, &lt;code&gt;shard&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deterministic per-node sequencing&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RFC 4122 / UUID v8-compatible layout&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;human-friendlier Base58 encoding&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;full decode support&lt;/strong&gt; for observability and debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need identifiers that are not just unique, but also &lt;strong&gt;operationally meaningful&lt;/strong&gt;, EUID gives you a structured alternative to purely random UUIDs.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why EUID?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Traditional identifiers solve uniqueness, but they do not always help with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ordered inserts in databases&lt;/li&gt;
&lt;li&gt;infrastructure traceability&lt;/li&gt;
&lt;li&gt;decoding where an ID came from&lt;/li&gt;
&lt;li&gt;correlating events across distributed nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EUID is built for those cases.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;In one sentence&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;EUID = sortable UUID v8 + topology metadata + deterministic sequencing&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;When to use EUID&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;EUID is a good…&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/louis-franck-moussima/euid-java" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>java</category>
      <category>backend</category>
      <category>api</category>
    </item>
    <item>
      <title>Designing a Structured UUID v8 Generator for Distributed Systems (EUID)</title>
      <dc:creator>Louis Franck M</dc:creator>
      <pubDate>Tue, 10 Mar 2026 08:24:49 +0000</pubDate>
      <link>https://dev.to/louis_franckm_2c5016864a/designing-a-structured-uuid-v8-generator-for-distributed-systems-euid-2ena</link>
      <guid>https://dev.to/louis_franckm_2c5016864a/designing-a-structured-uuid-v8-generator-for-distributed-systems-euid-2ena</guid>
      <description>&lt;p&gt;Unique identifiers are fundamental to modern software systems.&lt;br&gt;
Databases, APIs, microservices, and event-driven architectures all rely on them.&lt;/p&gt;

&lt;p&gt;Most developers simply use random UUIDs. But at scale, randomness can introduce limitations.&lt;/p&gt;

&lt;p&gt;This article introduces &lt;strong&gt;EUID (Evolutionary Unique Identifier)&lt;/strong&gt; — a structured UUID v8 generator designed for distributed systems and database-friendly indexing.&lt;/p&gt;


&lt;h1&gt;
  
  
  The Problem With Traditional UUIDs
&lt;/h1&gt;
&lt;h2&gt;
  
  
  UUID v4
&lt;/h2&gt;

&lt;p&gt;The most commonly used UUID is &lt;strong&gt;version 4&lt;/strong&gt;, which is completely random.&lt;/p&gt;

&lt;p&gt;While this guarantees uniqueness, it has several drawbacks in large systems:&lt;/p&gt;

&lt;p&gt;• no time ordering&lt;br&gt;
• poor database index locality&lt;br&gt;
• opaque identifiers&lt;br&gt;
• no infrastructure awareness&lt;/p&gt;

&lt;p&gt;When UUID v4 values are used as database primary keys, inserts become effectively random, which can fragment indexes and reduce performance.&lt;/p&gt;


&lt;h2&gt;
  
  
  UUID v7
&lt;/h2&gt;

&lt;p&gt;The newer &lt;strong&gt;UUID v7&lt;/strong&gt; specification introduces &lt;strong&gt;time ordering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;p&gt;• a 48-bit timestamp&lt;br&gt;
• random entropy bits&lt;/p&gt;

&lt;p&gt;This greatly improves database performance because records are inserted in roughly chronological order.&lt;/p&gt;

&lt;p&gt;However, UUID v7 remains intentionally random beyond the timestamp.&lt;/p&gt;

&lt;p&gt;In some distributed systems, it can be useful for identifiers to contain &lt;strong&gt;information about the infrastructure that generated them&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  A Different Approach: Structured Identifiers
&lt;/h1&gt;

&lt;p&gt;Instead of relying on randomness, some distributed systems prefer &lt;strong&gt;structured identifiers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;p&gt;• snowflake-style identifiers&lt;br&gt;
• sharded database IDs&lt;br&gt;
• topology-aware identifiers&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;p&gt;An identifier can encode &lt;strong&gt;where it was generated&lt;/strong&gt;, not just &lt;strong&gt;when&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This can help with:&lt;/p&gt;

&lt;p&gt;• debugging distributed systems&lt;br&gt;
• tracing requests&lt;br&gt;
• understanding data origin&lt;br&gt;
• operational observability&lt;/p&gt;

&lt;p&gt;This philosophy inspired the design of &lt;strong&gt;EUID&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  Introducing EUID
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;EUID (Evolutionary Unique Identifier)&lt;/strong&gt; is a &lt;strong&gt;UUID v8-compatible identifier&lt;/strong&gt; that combines:&lt;/p&gt;

&lt;p&gt;• time ordering&lt;br&gt;
• topology encoding&lt;br&gt;
• deterministic generation&lt;/p&gt;

&lt;p&gt;Unlike random UUIDs, EUID identifiers are &lt;strong&gt;fully decodable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From a single identifier you can determine:&lt;/p&gt;

&lt;p&gt;• when it was generated&lt;br&gt;
• which region generated it&lt;br&gt;
• which shard handled it&lt;br&gt;
• which node created it&lt;br&gt;
• the sequence number&lt;/p&gt;


&lt;h1&gt;
  
  
  EUID Bit Layout
&lt;/h1&gt;

&lt;p&gt;EUID uses the 128-bit UUID structure with the following layout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bits&lt;/th&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;Timestamp (milliseconds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Version (UUID v8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Shard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Variant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Timestamp
&lt;/h3&gt;

&lt;p&gt;A 48-bit millisecond timestamp ensures &lt;strong&gt;time ordering&lt;/strong&gt; and database-friendly indexing.&lt;/p&gt;
&lt;h3&gt;
  
  
  Region / Shard / Node
&lt;/h3&gt;

&lt;p&gt;These fields encode &lt;strong&gt;distributed topology&lt;/strong&gt;, allowing identifiers to carry infrastructure metadata.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sequence
&lt;/h3&gt;

&lt;p&gt;Each node maintains a &lt;strong&gt;monotonic sequence counter&lt;/strong&gt; to generate multiple identifiers within the same millisecond.&lt;/p&gt;


&lt;h1&gt;
  
  
  Operational Observability Through Identifiers
&lt;/h1&gt;

&lt;p&gt;One interesting side effect of structured identifiers is &lt;strong&gt;operational observability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In many systems, identifiers are opaque.&lt;br&gt;
When something fails in production, engineers often need to query logs or databases just to determine &lt;strong&gt;where an identifier originated&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because EUID embeds topology information directly in the identifier, operational metadata can be extracted immediately.&lt;/p&gt;

&lt;p&gt;From a single identifier you can determine:&lt;/p&gt;

&lt;p&gt;• when it was generated&lt;br&gt;
• which region produced it&lt;br&gt;
• which shard handled the request&lt;br&gt;
• which node created the identifier&lt;/p&gt;

&lt;p&gt;Instead of being black boxes, identifiers become &lt;strong&gt;structured infrastructure signals&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  Example Usage
&lt;/h1&gt;

&lt;p&gt;Generating an identifier in Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;EuidGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EuidGenerator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="no"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EUID: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;019caad2-a445-8083-8005-000000000011
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The identifier can then be decoded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;DecodedEuid&lt;/span&gt; &lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EuidDecoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstant&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRegion&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getShard&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNode&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSequence&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Base58 Encoding
&lt;/h1&gt;

&lt;p&gt;EUID also supports &lt;strong&gt;Base58 encoding&lt;/strong&gt;, which produces shorter and more human-friendly identifiers.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1CYctoRWaz5VGXwscmiovG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Base58 avoids visually confusing characters such as:&lt;/p&gt;

&lt;p&gt;• 0 and O&lt;br&gt;
• l and I&lt;/p&gt;

&lt;p&gt;This makes identifiers easier to use in URLs, logs, and APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  When Should You Use EUID?
&lt;/h1&gt;

&lt;p&gt;EUID can be useful when you need:&lt;/p&gt;

&lt;p&gt;• time-ordered identifiers&lt;br&gt;
• database-friendly indexing&lt;br&gt;
• infrastructure-aware IDs&lt;br&gt;
• deterministic identifier structure&lt;/p&gt;

&lt;p&gt;If you only need a random identifier, &lt;strong&gt;UUID v4 or UUID v7 may already be sufficient&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EUID is designed for systems where &lt;strong&gt;traceability and infrastructure awareness are important&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Open Source Project
&lt;/h1&gt;

&lt;p&gt;The EUID library is open source and available on Maven Central.&lt;/p&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://github.com/louis-franck-moussima/euid-java" rel="noopener noreferrer"&gt;https://github.com/louis-franck-moussima/euid-java&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;The project includes:&lt;/p&gt;

&lt;p&gt;• a high-performance generator&lt;br&gt;
• Base58 encoding support&lt;br&gt;
• full decode capability&lt;br&gt;
• unit tests and stress tests&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Identifiers are often treated as opaque random values.&lt;/p&gt;

&lt;p&gt;But in distributed systems, identifiers can carry &lt;strong&gt;valuable structural information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EUID explores an alternative approach using &lt;strong&gt;UUID v8 with deterministic topology encoding&lt;/strong&gt;, producing identifiers that are:&lt;/p&gt;

&lt;p&gt;• time ordered&lt;br&gt;
• infrastructure aware&lt;br&gt;
• database friendly&lt;br&gt;
• fully decodable&lt;/p&gt;

&lt;p&gt;If you are interested in the project, feel free to explore the repository or try the library in your own systems.&lt;br&gt;
Feedback and discussion are always welcome you can leave questions in comments.&lt;/p&gt;

</description>
      <category>java</category>
      <category>distributedsystems</category>
      <category>opensource</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
