{"id":4792,"date":"2025-11-27T09:21:53","date_gmt":"2025-11-27T07:21:53","guid":{"rendered":"https:\/\/mariusbancila.ro\/blog\/?p=4792"},"modified":"2025-11-27T09:21:55","modified_gmt":"2025-11-27T07:21:55","slug":"universally-unique-lexicographically-sortable-identifiers-ulids","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/","title":{"rendered":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In my <a href=\"https:\/\/mariusbancila.ro\/blog\/2025\/10\/24\/time-based-universally-unique-identifiers-uuids-v7\/\" target=\"_blank\" rel=\"noopener\" title=\"\">previous post<\/a>, I talked about time-based universally unique identifiers &#8211; UUID v7 for short. An alternative to UUIDs (especially to version 4) is the ULID, which stands for <strong>U<\/strong>niversally unique <strong>L<\/strong>exicographically sortable <strong>ID<\/strong>entifier. These are similar with UUIDs, they have the same 128 bit length, but offer several advantages. Let&#8217;s see what these are and how ULIDs can be used.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Overview of ULIDs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are several similarities between ULID and UUID:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>they both have 128-bits<\/li><li>their string encoding is case insensitive<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With UUID v7 it shares more similarities:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>the most significant 48 bits are the UNIX time in milliseconds, the rest of the 80 bits are random<\/li><li>monotonic sort order<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Other characteristics of ULIDs are:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>1.21e+24 unique ULIDs per millisecond<\/li><li>canonically encoded as a 26 character string (without any dashes as in the case of UUID)<\/li><li>no special characters used<\/li><li>Uses Crockford&#8217;s base32 for better efficiency and readability (5 bits per character)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Examples of ULID:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>R29AT090TEA6XYY0ZXR0W3CD60<\/li><li>4xx3ns5am83hwsbmkkbaw3cd60<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">A C++ Implementation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ULIDs can be implemented in C++ in different ways. Such a possible implementation is show below.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">struct ulid_t\n{\npublic:\n   static ulid_t generate()\n   {\n      ulid_t ulid;\n\n      uint64_t ts = now_ms();\n      ulid.data[0] = (ts >> 40) &amp; 0xFF;\n      ulid.data[1] = (ts >> 32) &amp; 0xFF;\n      ulid.data[2] = (ts >> 24) &amp; 0xFF;\n      ulid.data[3] = (ts >> 16) &amp; 0xFF;\n      ulid.data[4] = (ts >> 8) &amp; 0xFF;\n      ulid.data[5] = (ts >> 0) &amp; 0xFF;\n\n      static thread_local std::mt19937 rng{ std::random_device{}() };\n      for (size_t i = 6; i &lt; 16; ++i) \n      {\n         ulid.data[i] = static_cast&lt;uint8_t>(rng());\n      }\n\n      return ulid;\n   }\n\n   std::string string() const \n   {\n      return encode_base32(data);\n   }\n\n   explicit operator std::string() const \n   {\n      return encode_base32(data);\n   }\n\nprivate:\n   std::array&lt;uint8_t, 16> data{};\n\n   static uint64_t now_ms() \n   {\n      using namespace std::chrono;\n      return duration_cast&lt;milliseconds>(system_clock::now().time_since_epoch()).count();\n   }\n\n   \/\/ Crockford Base32\n   static constexpr char ENCODING[32] = \n   {\n       '0','1','2','3','4','5','6','7','8','9',\n       'A','B','C','D','E','F','G','H','J','K',\n       'M','N','P','Q','R','S','T','V','W','X',\n       'Y','Z'\n   };\n\n   \/\/ Extracts 26 * 5-bit groups (LSB-first) from the 16 bytes\n   static std::string encode_base32(const std::array&lt;uint8_t, 16>&amp; bytes)\n   {\n      std::string out(26, '0');\n\n      \/\/ ULID has 128 bits, but encoding requires 130 bits, pad zero bits at start\n      uint32_t bitpos = 128 + 2;  \/\/ pretend we have 130 bits\n\n      for (int i = 0; i &lt; 26; ++i)\n      {\n         bitpos -= 5;\n\n         uint32_t value = extract_5bits(bytes, bitpos);\n         out[i] = ENCODING[value];\n      }\n\n      return out;\n   }\n\n   \/\/ Extract exactly 5 bits from an arbitrary bit offset\n   static uint32_t extract_5bits(const std::array&lt;uint8_t, 16>&amp; bytes, uint32_t bitpos)\n   {\n      \/\/ byte index and bit offset in that byte\n      uint32_t byteIndex = bitpos >> 3;\n      uint32_t startBit = bitpos &amp; 7;\n\n      \/\/ Read 16 bits starting at byteIndex\n      uint32_t v = (bytes[byteIndex] &lt;&lt; 8) |\n         (byteIndex + 1 &lt; 16 ? bytes[byteIndex + 1] : 0);\n\n      \/\/ Shift to get a 5-bit window\n      v >>= (11 - startBit); \/\/ from the 16-bit window\n\n      return v &amp; 0x1F;       \/\/ last 5 bits\n   }\n};<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This can be use as follows:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ulid_t ulid = ulid_t::generate();\nstd::println(\"{}\", static_cast&lt;std::string>(ulid));<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Libraries<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The above implementation is a simplistic proof of concept. However, there is a plethora of libraries for all major programming languages, including C++, C#, Java, JavaScript, Go, Python, Rust. You can find a list of such libraries <a href=\"https:\/\/github.com\/ulid\/spec?tab=readme-ov-file#implementations-in-other-languages\" target=\"_blank\" rel=\"noopener\" title=\"\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">See also<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can read more about ULIDs in these articles:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/ulid\/spec\" target=\"_blank\" rel=\"noopener\" title=\"\">ULID specifications<\/a><\/li><li><a href=\"https:\/\/dev.to\/nejos97\/what-is-ulid-and-why-should-you-start-using-it-14j9\" target=\"_blank\" rel=\"noopener\" title=\"\">What is ULID and why should you start using it?<\/a><\/li><li><a href=\"https:\/\/www.baeldung.com\/cs\/ulid-vs-uuid\" target=\"_blank\" rel=\"noopener\" title=\"\">Lexicographically Sortable Identifiers Using ULID<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In my previous post, I talked about time-based universally unique identifiers &#8211; UUID v7 for short. An alternative to UUIDs (especially to version 4) is the ULID, which stands for Universally unique Lexicographically sortable IDentifier. These are similar with UUIDs, they have the same 128 bit length, but offer several advantages. Let&#8217;s see what these &#8230; <a title=\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/\" aria-label=\"Read more about Universally Unique Lexicographically Sortable Identifiers (ULIDs)\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[451,652,537],"class_list":["post-4792","post","type-post","status-publish","format-standard","hentry","category-c","tag-c","tag-ulid","tag-uuid"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"c++,ulid,uuid\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-11-27T07:21:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-11-27T07:21:55+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#article\",\"name\":\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\",\"headline\":\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2025-11-27T09:21:53+02:00\",\"dateModified\":\"2025-11-27T09:21:55+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#webpage\"},\"articleSection\":\"C++, C++, ulid, uuid\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#listItem\",\"name\":\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#listItem\",\"position\":5,\"name\":\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/\",\"name\":\"Universally Unique Lexicographically Sortable Identifiers (ULIDs)\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2025\\\/11\\\/27\\\/universally-unique-lexicographically-sortable-identifiers-ulids\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2025-11-27T09:21:53+02:00\",\"dateModified\":\"2025-11-27T09:21:55+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/","robots":"max-image-preview:large","keywords":"c++,ulid,uuid","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#article","name":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","headline":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2025-11-27T09:21:53+02:00","dateModified":"2025-11-27T09:21:55+02:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#webpage"},"articleSection":"C++, C++, ulid, uuid"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#listItem","name":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#listItem","position":5,"name":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/","name":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2025-11-27T09:21:53+02:00","dateModified":"2025-11-27T09:21:55+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)","og:url":"https:\/\/mariusbancila.ro\/blog\/2025\/11\/27\/universally-unique-lexicographically-sortable-identifiers-ulids\/","article:published_time":"2025-11-27T07:21:53+00:00","article:modified_time":"2025-11-27T07:21:55+00:00","twitter:card":"summary","twitter:title":"Universally Unique Lexicographically Sortable Identifiers (ULIDs)"},"aioseo_meta_data":{"post_id":"4792","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2025-11-25 18:11:34","updated":"2025-12-12 07:59:22","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":2,"uagb_excerpt":"In my previous post, I talked about time-based universally unique identifiers &#8211; UUID v7 for short. An alternative to UUIDs (especially to version 4) is the ULID, which stands for Universally unique Lexicographically sortable IDentifier. These are similar with UUIDs, they have the same 128 bit length, but offer several advantages. Let&#8217;s see what these&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">ulid<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">uuid<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">ulid<\/span>","<span class=\"advgb-post-tax-term\">uuid<\/span>"]}},"comment_count":"2","relative_dates":{"created":"Posted 10 months ago","modified":"Updated 10 months ago"},"absolute_dates":{"created":"Posted on November 27, 2025","modified":"Updated on November 27, 2025"},"absolute_dates_time":{"created":"Posted on November 27, 2025 9:21 am","modified":"Updated on November 27, 2025 9:21 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-1fi","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=4792"}],"version-history":[{"count":4,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4792\/revisions"}],"predecessor-version":[{"id":4796,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4792\/revisions\/4796"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=4792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=4792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=4792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}