Menu

Tree [r15] /
 History

HTTPS access


File Date Author Commit
 LICENSE 2024-01-17 gdemont [r1] Added Ada files and a README
 README.md 2024-09-29 gdemont [r15] Updated format of examples in README
 ulid.adb 2024-09-19 gdemont [r12] Added text representation decoding and I/O cons...
 ulid.ads 2024-09-19 gdemont [r12] Added text representation decoding and I/O cons...
 ulid.gpr 2024-09-19 gdemont [r13] Improved documentation
 ulid_test.adb 2024-09-19 gdemont [r12] Added text representation decoding and I/O cons...

Read Me

ULID-Ada

Implementation of ULID (Universally Unique Lexicographically Sortable Identifier) in Ada.

In a nutshell, a ULID code (Universally Unique Lexicographically Sortable Identifier) is
a combination of a 48-bit time stamp (most significant part, with a millisecond accuracy),
and a 80-bit random number (least significant part), totalling 128 bits, that is 16 bytes (octets).

Usage

The package ULID provides two functions Generate.
One function produces a 128-bit number that can be output (for instance) in the UUID format.
One function produces a string in the Base32 format (Crockford variant) - the preferred (canonical) representation of a ULID.
Additionally, the Generate_Monotonic function enables the production of a monotonically increasing sequence of ULID numbers within the same millisecond.
The function Encode_as_8_4_4_4_12 outputs a text representation of a ULID number in the usual UUID 8-4-4-4-12 format (like: 01920161-d64d-5a3e-589e-c45df155547b).
Both formats (Base32 and 8-4-4-4-12) are also recognized by the Decode function.

All functions are task-safe (several Ada tasks can call Generate at the same
time without messing the pseudo-random generator) and you can optionally set a time zone offset.

Generating ULID's

Here is an example for generating ULID's:

with Ada.Text_IO;
with ULID;

procedure ULID_Test is
  use Ada.Text_IO, ULID;
  gen : Random_Generator;
begin
  Reset (gen);  --  Randomize
  for i in 1 .. 10 loop
    Put_Line (ULID.Generate (gen));
  end loop;
  Put ("Press Return");
  Skip_Line;
end ULID_Test;

With AdaCore's GNAT you can build and run the test using the ulid.gpr project file.

Here is an example of ULIDs in their canonical text representation (Base32):

  01J8ZGFCTBGE4X4ZG1G5MVJQQQ
  01J8ZGFCTB35CA4YGH0RD25R5B
  01J8ZGFCTCZE7YSRQWAQNQHFAC
  01J8ZGFCTC4E3PBBJ3ASYZRBB4

Another bunch of ULIDs in the usual UUID/GUID 8-4-4-4-12 format:

  {01923f07-b34c-7693-6d40-a3844156c1ae}
  {01923f07-b34c-efde-95e7-08decfe60c07}
  {01923f07-b34c-dc69-2ef1-2ac4b7c9bc84}
  {01923f07-b34c-81d0-667c-43694d2f740a}

License

ULID-Ada is released under the MIT license.
See the LICENSE file for more info.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.