(ULID) – это современная альтернатива традиционным GUID-ом, которая обеспечивает лучшую совместимость и функциональность при необходимости сортировки. В этой статье мы рассмотрим преимущества ULID перед GUID, а также продемонстрируем, как создать реализацию ULID на Delphi.
Почему ULID лучше GUID?
GUID (Globally Unique Identifier) – это 128-битный уникальный идентификатор, который широко используется в различных приложениях и системах. Однако GUID имеет несколько недостатков:
Неlexicographically sortable: ГУИДы не могут быть отсортированы лексикографически, что может вызвать проблемы при хранении и поиске данных.
Long string representation: ГУИДы представлены в виде 36-символьной строки, что делает их громоздкими для хранения и передачи.
Special characters: ГУИДы содержат специальные символы (-), что может вызвать проблемы при использовании их в URL-адресах или других строках.
ULID преодолевает эти ограничения, предлагая лучшую совместимость и функциональность:
128-bit compatibility with UUID: ULID полностью совместим с GUID по битности.
1.21e+24 unique ULIDs per millisecond: ULID обеспечивает гораздо больше уникальных идентификаторов в миллисекунду, чем GUID.
Lexicographically sortable: ULID можно отсортировать лексикографически, что облегчает хранение и поиск данных.
Canonically encoded as a 26 character string: ULID представлен в виде 26-символьной строки, что делает его более компактным и удобным для использования.
Uses Crockford's base32 for better efficiency and readability (5 bits per character): ULID использует базу32 Крокфорда для лучшей эффективности и читаемости.
Case insensitive: ULID нечувствителен к регистру, что облегчает сравнение и сортировку.
No special characters (URL safe): ULID не содержит специальных символов, что делает его безопасным для использования в URL-адресах и других строках.
Реализация ULID на Delphi
Теперь давайте рассмотрим, как создать реализацию ULID на Delphi. Мы будем использовать открытый исходный код библиотеки VSoft.Ulid, созданной Vincentem Parrettом.
Извлеките содержимое архива в папку вашего проекта Delphi.
Добавьте файлы VSoft.Ulid.pas и VSoft.Ulid.bpi в свой проект.
Теперь вы можете использовать ULID в своем проекте, как показано в примере кода ниже:
program UlidExample;
{$APPTYPE CONSOLE}
uses
SysUtils,
VSoft.Ulid;
var
ulid: TULID;
begin
// Создайте новый ULID
ulid := TULID.Create;
Writeln('New ULID: ', ulid.ToString);
// Проверьте, является ли ULID валидным
if ulid.IsValid then
Writeln('ULID is valid')
else
Writeln('ULID is not valid');
// Сравните два ULID
if ulid = TULID.Parse('01AR2C3D4E5F6G7H8IJ') then
Writeln('ULIDs are equal')
else
Writeln('ULIDs are not equal');
// Отсортируйте массив ULID
var ulids: TArray<TULID>;
SetLength(ulids, 5);
for i := 0 to 4 do
ulids[i] := TULID.Parse('01AR2C3D4E5F6G7H8IJ' + IntToHex(i, 2));
ulids.Sort;
for i := 0 to 4 do
Writeln(ulids[i].ToString);
// Освободите ресурсы
ulid.Free;
Readln;
end.
В этом примере мы создаем новый ULID, проверяем его валидность, сравниваем два ULID и сортируем массив ULID. Все эти операции можно выполнять с помощью библиотеки VSoft.Ulid.
Альтернативное решение: генерация собственного уникального идентификатора
Хотя ULID предлагает много преимуществ перед GUID, вы также можете создать собственную реализацию уникального идентификатора для удовлетворения конкретных потребностей вашего проекта. Например, вы можете использовать комбинацию текущего времени, процесса и потока для генерации уникального идентификатора.
Ниже приведен пример кода на Delphi, демонстрирующий генерацию собственного уникального идентификатора:
program CustomIdExample;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes;
type
TCustomID = class
private
FCurrentTime: TDateTime;
FProcessID, FThreadID: Cardinal;
public
constructor Create;
function ToString: string;
property CurrentTime: TDateTime read FCurrentTime;
end;
constructor TCustomID.Create;
begin
FCurrentTime := Now;
FProcessID := GetCurrentProcessId;
FThreadID := GetCurrentThreadId;
end;
function TCustomID.ToString: string;
var
TimeStr, ProcessStr, ThreadStr: string;
begin
TimeStr := FormatDateTime('yyyyMMddHHmmssfff', FCurrentTime);
ProcessStr := IntToHex(FProcessID, 4);
ThreadStr := IntToHex(FThreadID, 4);
Result := TimeStr + ProcessStr + ThreadStr;
end;
var
customId: TCustomID;
begin
customId := TCustomID.Create;
Writeln('New Custom ID: ', customId.ToString);
Readln;
customId.Free;
end.
В этом примере мы создаем собственный уникальный идентификатор, комбинируя текущее время, процесс и поток. Хотя это решение не предлагает всех преимуществ ULID, оно может быть полезным в определенных сценариях.
Заключение
ULID – это современная альтернатива GUID, которая обеспечивает лучшую совместимость и функциональность при необходимости сортировки. В этой статье мы рассмотрели преимущества ULID перед GUID и продемонстрировали, как создать реализацию ULID на Delphi с помощью библиотеки VSoft.Ulid.
Кроме того, мы представили альтернативное решение: генерация собственного уникального идентификатора для удовлетворения конкретных потребностей вашего проекта. Выбрав подходящее решение в зависимости от ваших требований, вы можете гарантировать надежную и эффективную работу с уникальными идентификаторами в своих приложениях Delphi.
Спасибо за внимание!
Статья о преимуществах Универсального Уникального Лексикографически Сортируемого Идентификатора (ULID) перед Глобальным Уникальным Идентификатором (GUID), а также пример реализации ULID на Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS