Este projeto é uma porta .Net (com modificações) de https://github.com/rs/xid de Olivier Poitrey. Partes significativas do código e deste leia-me são baseadas nesse projeto.
Xid.Net é uma biblioteca geradora de id globalmente exclusiva, pronta para ser usada com segurança e diretamente em seu código. Ele fornece uma interface semelhante ao System.Guid, mas gera ids menores (12 bytes versus 16 no formato bruto, 20 versus 36 quando convertido em uma string). A geração de Xids é mais rápida que a de Guids, muitas vezes de forma significativa.
Xid usa o algoritmo Mongo Object ID para gerar ids globalmente exclusivos com uma serialização diferente (base32 vs base64) para torná-lo mais curto quando transportado como uma string: https://docs.mongodb.org/manual/reference/object-id/.
PM > Install-Package Yort.Xid.Net
Criando um Xid;
var id = Xid . NewXid ( ) ;
Convertendo para Xid em uma string;
var id = Xid . NewXid ( ) ;
var idString = id . ToString ( ) ;
Convertendo uma string em um Xid (método TryParse também fornecido);
var idString = " 9m4e2mr0ui3e8a215n4g " ;
var id = Xid . Parse ( idString ) ;
Convertendo para Xid em uma matriz de bytes;
var id = Xid . NewXid ( ) ;
var bytes = id . ToBytes ( ) ;
ou
var id = Xid . NewXid ( ) ;
var preallocatedByteArray = new byte [ 12 ] ;
var bytes = id . ToBytes ( preallocatedByteArray ) ;
Obtendo componentes de um Xid;
var xid = Xid . NewXid ( ) ;
DateTime timestamp = xid . GetTimeStamp ( ) ;
byte [ ] machineId = xid . GetMachineId ( ) ;
UInt16 processId = xid . GetProcessId ( ) ;
int counter = xid . GetCounter ( ) ;
Também suportados/outros recursos de implementação .Net;
O formato de um Xid é;
A representação binária do id é compatível com IDs de objeto de 12 bytes do Mongo. A representação de string usa hexadecimal base32 (sem preenchimento) para melhor eficiência de espaço quando armazenada nesse formato (20 bytes). A variante hexadecimal de base32 é usada para reter a propriedade classificável do id.
O Xid não usa base64 porque a diferenciação de maiúsculas e minúsculas e os 2 caracteres não alfanuméricos podem ser um problema quando transportados como uma string entre vários sistemas. Base36 não foi usado porque não é padrão, o tamanho resultante não é previsível (não alinhado aos bits) e não permaneceria classificável. Para validar um xid base32, espere uma sequência de 20 caracteres, toda em letras minúsculas, usando caracteres no intervalo de a a v e de 0 a 9 números ([0-9a-v]{20}).
UUIDs têm 16 bytes (128 bits) e 36 caracteres como representação de string. Os IDs do Twitter Snowflake têm 8 bytes (64 bits), mas exigem configuração de máquina/data center e/ou servidores geradores centrais. Xid fica entre 12 bytes (96 bits) com uma representação de string mais compacta e segura para URL (20 caracteres). Nenhuma configuração ou servidor gerador central é necessária para que possa ser usado diretamente no código da aplicação.
Nome | Tamanho Binário | Tamanho da corda | Características |
---|---|---|---|
UUID | 16 bytes | 36 caracteres | configuração livre, não classificável |
shortuuid | 16 bytes | 22 caracteres | configuração livre, não classificável |
Floco de neve | 8 bytes | até 20 caracteres | precisa de configuração de máquina/DC, precisa de servidor central, classificável |
MongoID | 12 bytes | 24 caracteres | configuração livre, classificável |
xid | 12 bytes | 20 caracteres | configuração livre, classificável |
32 bits
BenchmarkDotNet=v0.10.9, SO=Windows 10 Redstone 2 (10.0.15063)
Processador = CPU Intel Core i7-6820HQ 2,70 GHz (Skylake), Número de processadores = 8
Frequência=2648436 Hz, Resolução=377,5813 ns, Temporizador=TSC
[Host]: .NET Framework 4.7 (CLR 4.0.30319.42000), LegacyJIT-v4.7.2101.1 de 32 bits
Trabalho padrão: .NET Framework 4.7 (CLR 4.0.30319.42000), LegacyJIT-v4.7.2101.1 de 32 bits
Método | Significar | Erro | Desv padrão |
---|---|---|---|
CriarXidBenchmark | 36,94ns | 0,2248ns | 0,2103ns |
CreateGuidBenchmark | 201,27 ns | 6,9994ns | 6,5473ns |
64 bits
BenchmarkDotNet=v0.10.9, SO=Windows 10 Redstone 2 (10.0.15063)
Processador = CPU Intel Core i7-6820HQ 2,70 GHz (Skylake), Número de processadores = 8
Frequência=2648436 Hz, Resolução=377,5813 ns, Temporizador=TSC
[Host]: .NET Framework 4.7 (CLR 4.0.30319.42000), RyuJIT-v4.7.2101.1 de 64 bits
Trabalho padrão: .NET Framework 4.7 (CLR 4.0.30319.42000), RyuJIT-v4.7.2101.1 de 64 bits
Método | Significar | Erro | Desv padrão |
---|---|---|---|
CriarXidBenchmark | 23,56ns | 0,1409ns | 0,1100ns |
CreateGuidBenchmark | 82,41ns | 0,2656ns | 0,2354ns |
Todo o código-fonte é licenciado sob a licença MIT. Licença de repositório Xid original em; Licença Xid.