Этот проект представляет собой порт .Net (с изменениями) https://github.com/rs/xid Оливье Пуатри. Значительные части кода и этот файл readme основаны на этом проекте.
Xid.Net — это глобальная уникальная библиотека генератора идентификаторов, готовая к безопасному использованию непосредственно в вашем коде. Он предоставляет интерфейс, аналогичный System.Guid, но генерирует идентификаторы меньшего размера (12 байт против 16 в необработанном формате, 20 против 36 при преобразовании в строку). Генерация Xids происходит быстрее, чем Guids, часто значительно.
Xid использует алгоритм идентификатора объекта Mongo для генерации глобальных уникальных идентификаторов с различной сериализацией (base32 или base64), чтобы сделать его короче при транспортировке в виде строки: https://docs.mongodb.org/manual/reference/object-id/.
PM > Install-Package Yort.Xid.Net
Создание Xid;
var id = Xid . NewXid ( ) ;
Преобразование Xid в строку;
var id = Xid . NewXid ( ) ;
var idString = id . ToString ( ) ;
Преобразование строки в Xid (также предусмотрен метод TryParse);
var idString = " 9m4e2mr0ui3e8a215n4g " ;
var id = Xid . Parse ( idString ) ;
Преобразование в Xid в байтовый массив;
var id = Xid . NewXid ( ) ;
var bytes = id . ToBytes ( ) ;
или
var id = Xid . NewXid ( ) ;
var preallocatedByteArray = new byte [ 12 ] ;
var bytes = id . ToBytes ( preallocatedByteArray ) ;
Получение компонентов Xid;
var xid = Xid . NewXid ( ) ;
DateTime timestamp = xid . GetTimeStamp ( ) ;
byte [ ] machineId = xid . GetMachineId ( ) ;
UInt16 processId = xid . GetProcessId ( ) ;
int counter = xid . GetCounter ( ) ;
Также поддерживаются и другие функции реализации .Net;
Формат Xid:
Двоичное представление идентификатора совместимо с 12-байтовыми идентификаторами объектов Mongo. Строковое представление использует шестнадцатеричный формат Base32 (без заполнения) для повышения эффективности использования пространства при хранении в такой форме (20 байт). Шестнадцатеричный вариант base32 используется для сохранения свойства сортировки идентификатора.
Xid не использует base64, поскольку чувствительность к регистру и два небуквенных символа могут стать проблемой при транспортировке в виде строки между различными системами. Base36 не использовался, поскольку он не является стандартным, результирующий размер непредсказуем (не выровнен по битам) и его нельзя будет сортировать. Чтобы проверить xid в base32, ожидайте последовательность символов в нижнем регистре длиной 20 символов, в которой используются символы в диапазоне от a до v и чисел от 0 до 9 ([0-9a-v]{20}).
UUID имеют длину 16 байт (128 бит) и 36 символов в виде строкового представления. Идентификаторы Twitter Snowflake имеют длину 8 байт (64 бита), но требуют конфигурации машины/центра обработки данных и/или центральных серверов-генераторов. Xid занимает промежуточное положение и имеет размер 12 байт (96 бит) с более компактным строковым представлением, безопасным для URL (20 символов). Никакой конфигурации или центрального сервера-генератора не требуется, поэтому его можно использовать непосредственно в коде приложения.
Имя | Двоичный размер | Размер строки | Функции |
---|---|---|---|
UUID | 16 байт | 36 символов | конфигурация бесплатная, не сортируемая |
короткий | 16 байт | 22 символа | конфигурация бесплатная, не сортируемая |
Снежинка | 8 байт | до 20 символов | требуется конфигурация машины/DC, нужен центральный сервер, сортируемый |
МонгоИД | 12 байт | 24 символа | свободная конфигурация, сортируемый |
XID | 12 байт | 20 символов | свободная конфигурация, сортируемый |
32-битный
BenchmarkDotNet=v0.10.9, ОС=Windows 10 Redstone 2 (10.0.15063)
Процессор = процессор Intel Core i7-6820HQ 2,70 ГГц (Skylake), ProcessorCount = 8
Частота=2648436 Гц, разрешение=377,5813 нс, таймер=TSC
[Хост]: .NET Framework 4.7 (CLR 4.0.30319.42000), 32-разрядная версия LegacyJIT-v4.7.2101.1.
DefaultJob: .NET Framework 4.7 (CLR 4.0.30319.42000), 32-разрядная версия LegacyJIT-v4.7.2101.1.
Метод | Иметь в виду | Ошибка | стандартное отклонение |
---|---|---|---|
CreateXidBenchmark | 36,94 нс | 0,2248 нс | 0,2103 нс |
CreateGuidBenchmark | 201,27 нс | 6,9994 нс | 6,5473 нс |
64-битная
BenchmarkDotNet=v0.10.9, ОС=Windows 10 Redstone 2 (10.0.15063)
Процессор = процессор Intel Core i7-6820HQ 2,70 ГГц (Skylake), ProcessorCount = 8
Частота=2648436 Гц, разрешение=377,5813 нс, таймер=TSC
[Хост]: .NET Framework 4.7 (CLR 4.0.30319.42000), 64-битная версия RyuJIT-v4.7.2101.1.
DefaultJob: .NET Framework 4.7 (CLR 4.0.30319.42000), 64-битная версия RyuJIT-v4.7.2101.1.
Метод | Иметь в виду | Ошибка | стандартное отклонение |
---|---|---|---|
CreateXidBenchmark | 23,56 нс | 0,1409 нс | 0,1100 нс |
CreateGuidBenchmark | 82,41 нс | 0,2656 нс | 0,2354 нс |
Весь исходный код лицензируется по лицензии MIT. Оригинальная лицензия репозитория Xid по адресу; Лицензия Ксид.