이 프로젝트는 Olivier Poitrey가 작성한 https://github.com/rs/xid의 .Net 포트(수정 사항 포함)입니다. 코드와 이 추가 정보의 중요한 부분은 해당 프로젝트를 기반으로 합니다.
Xid.Net은 전 세계적으로 고유한 ID 생성기 라이브러리로, 코드에서 직접 안전하게 사용할 수 있습니다. System.Guid와 유사한 인터페이스를 제공하지만 더 작은 ID를 생성합니다(원시 형식에서는 12바이트 대 16바이트, 문자열로 변환하면 20바이트 대 36바이트). Xids 생성은 Guids보다 빠르며 종종 상당히 빠릅니다.
Xid는 Mongo 개체 ID 알고리즘을 사용하여 다른 직렬화(base32 대 base64)로 전역적으로 고유한 ID를 생성하여 문자열로 전송할 때 더 짧게 만듭니다(https://docs.mongodb.org/manual/reference/object-id/).
PM > Install-Package Yort.Xid.NetXid 생성;
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의 형식은 다음과 같습니다.
ID의 이진 표현은 Mongo 12바이트 개체 ID와 호환됩니다. 문자열 표현은 해당 형식(20바이트)으로 저장될 때 더 나은 공간 효율성을 위해 base32 16진수(패딩 없음)를 사용합니다. base32의 16진수 변형은 ID의 정렬 가능한 속성을 유지하는 데 사용됩니다.
다양한 시스템 간에 문자열로 전송될 때 대소문자 구분과 영숫자가 아닌 문자 2개가 문제가 될 수 있으므로 Xid는 base64를 사용하지 않습니다. Base36은 표준이 아니고 결과 크기를 예측할 수 없으며(비트 정렬이 아님) 정렬 가능한 상태로 유지되지 않기 때문에 사용되지 않았습니다. base32 xid를 확인하려면 a~v 범위의 문자와 0~9개의 숫자([0-9a-v]{20})를 사용하는 20자 길이의 모두 소문자 시퀀스를 예상합니다.
UUID는 문자열 표현으로 16바이트(128비트) 및 36자입니다. Twitter Snowflake ID는 8바이트(64비트)이지만 시스템/데이터 센터 구성 및/또는 중앙 생성기 서버가 필요합니다. Xid는 보다 간결한 URL 안전 문자열 표현(20자)을 사용하여 12바이트(96비트) 사이에 있습니다. 구성이나 중앙 생성기 서버가 필요하지 않으므로 애플리케이션 코드에서 직접 사용할 수 있습니다.
| 이름 | 바이너리 크기 | 문자열 크기 | 특징 |
|---|---|---|---|
| UUID | 16바이트 | 36자 | 구성이 자유롭고 정렬할 수 없습니다. |
| 짧은 | 16바이트 | 22자 | 구성이 자유롭고 정렬할 수 없습니다. |
| 눈송이 | 8바이트 | 최대 20자 | 기계/DC 구성 필요, 중앙 서버 필요, 정렬 가능 |
| 몽고ID | 12바이트 | 24자 | 구성이 필요 없으며 정렬 가능 |
| xid | 12바이트 | 20자 | 구성이 필요 없으며 정렬 가능 |
32비트
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 2(10.0.15063)
프로세서=Intel Core i7-6820HQ CPU 2.70GHz(Skylake), ProcessorCount=8
주파수=2648436Hz, 해상도=377.5813ns, 타이머=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
| 방법 | 평균 | 오류 | 표준편차 |
|---|---|---|---|
| CreateXid벤치마크 | 36.94ns | 0.2248ns | 0.2103ns |
| CreateGuid벤치마크 | 201.27ns | 6.9994ns | 6.5473ns |
64비트
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 2(10.0.15063)
프로세서=Intel Core i7-6820HQ CPU 2.70GHz(Skylake), ProcessorCount=8
주파수=2648436Hz, 해상도=377.5813ns, 타이머=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
| 방법 | 평균 | 오류 | 표준편차 |
|---|---|---|---|
| CreateXid벤치마크 | 23.56ns | 0.1409ns | 0.1100ns |
| CreateGuid벤치마크 | 82.41ns | 0.2656ns | 0.2354ns |
모든 소스 코드는 MIT 라이선스에 따라 라이선스가 부여됩니다. 원본 Xid 저장소 라이센스: 시드 라이센스.