Sample code for 30+ languages & platforms
Delphi DLL

Generate Monotonic ULIDs

See more ULID/UUID Examples

Generate a sequence of monotonic ULIDs all using the same seed time. This code sample generates a series of ULIDs with continuously increasing values.

Important: Chilkat's ULID functionality was introduced in v9.5.0.94.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CkDateTime, StringBuilder;

...

procedure TForm1.Button1Click(Sender: TObject);
var
seedDt: HCkDateTime;
utc: Boolean;
ulid: PWideChar;
sbUlid: HCkStringBuilder;
i: Integer;

begin
seedDt := CkDateTime_Create();

// You can set the seed time to any desired value.
// In this example, the seed time is set to the current system date/time.
CkDateTime_SetFromCurrentSystemTime(seedDt);

// Generate the 1st ULID in the series.
// (i.e. the current UTC UNIX-time)
utc := True;
ulid := CkDateTime__ulidGenerate(seedDt,utc);
Memo1.Lines.Add(ulid);

// Store the ULID in a Chilkat StringBuilder to generate the series.
sbUlid := CkStringBuilder_Create();
CkStringBuilder_Append(sbUlid,ulid);

i := 0;
while i < 50 do
  begin
    CkDateTime_UlidIncrement(seedDt,sbUlid);
    Memo1.Lines.Add(CkStringBuilder__getAsString(sbUlid));
    i := i + 1;
  end;

// Sample output:

// 01GRGH30H8DMQ4F9A0XCTZHPGM
// 01GRGH30H8DMQ4F9A0XCTZHPGN
// 01GRGH30H8DMQ4F9A0XCTZHPGP
// 01GRGH30H8DMQ4F9A0XCTZHPGQ
// 01GRGH30H8DMQ4F9A0XCTZHPGR
// 01GRGH30H8DMQ4F9A0XCTZHPGS
// 01GRGH30H8DMQ4F9A0XCTZHPGT
// 01GRGH30H8DMQ4F9A0XCTZHPGV
// 01GRGH30H8DMQ4F9A0XCTZHPGW
// 01GRGH30H8DMQ4F9A0XCTZHPGX
// 01GRGH30H8DMQ4F9A0XCTZHPGY
// 01GRGH30H8DMQ4F9A0XCTZHPGZ
// 01GRGH30H8DMQ4F9A0XCTZHPH0
// 01GRGH30H8DMQ4F9A0XCTZHPH1
// 01GRGH30H8DMQ4F9A0XCTZHPH2
// 01GRGH30H8DMQ4F9A0XCTZHPH3
// 01GRGH30H8DMQ4F9A0XCTZHPH4
// 01GRGH30H8DMQ4F9A0XCTZHPH5
// 01GRGH30H8DMQ4F9A0XCTZHPH6
// 01GRGH30H8DMQ4F9A0XCTZHPH7
// 01GRGH30H8DMQ4F9A0XCTZHPH8
// 01GRGH30H8DMQ4F9A0XCTZHPH9
// 01GRGH30H8DMQ4F9A0XCTZHPHA
// 01GRGH30H8DMQ4F9A0XCTZHPHB
// 01GRGH30H8DMQ4F9A0XCTZHPHC
// 01GRGH30H8DMQ4F9A0XCTZHPHD
// 01GRGH30H8DMQ4F9A0XCTZHPHE
// 01GRGH30H8DMQ4F9A0XCTZHPHF
// 01GRGH30H8DMQ4F9A0XCTZHPHG
// 01GRGH30H8DMQ4F9A0XCTZHPHH
// 01GRGH30H8DMQ4F9A0XCTZHPHJ
// 01GRGH30H8DMQ4F9A0XCTZHPHK
// 01GRGH30H8DMQ4F9A0XCTZHPHM
// 01GRGH30H8DMQ4F9A0XCTZHPHN
// 01GRGH30H8DMQ4F9A0XCTZHPHP
// 01GRGH30H8DMQ4F9A0XCTZHPHQ
// 01GRGH30H8DMQ4F9A0XCTZHPHR
// 01GRGH30H8DMQ4F9A0XCTZHPHS
// 01GRGH30H8DMQ4F9A0XCTZHPHT
// 01GRGH30H8DMQ4F9A0XCTZHPHV
// 01GRGH30H8DMQ4F9A0XCTZHPHW
// 01GRGH30H8DMQ4F9A0XCTZHPHX
// 01GRGH30H8DMQ4F9A0XCTZHPHY
// 01GRGH30H8DMQ4F9A0XCTZHPHZ
// 01GRGH30H8DMQ4F9A0XCTZHPJ0
// 01GRGH30H8DMQ4F9A0XCTZHPJ1
// 01GRGH30H8DMQ4F9A0XCTZHPJ2
// 01GRGH30H8DMQ4F9A0XCTZHPJ3
// 01GRGH30H8DMQ4F9A0XCTZHPJ4
// 01GRGH30H8DMQ4F9A0XCTZHPJ5
// 01GRGH30H8DMQ4F9A0XCTZHPJ6

CkDateTime_Dispose(seedDt);
CkStringBuilder_Dispose(sbUlid);

end;