Preciso de um identificador exclusivo no .NET (não é possível usar o GUID, pois é muito longo para este caso).
As pessoas acham que o algoritmo usado aqui é um bom candidato ou você tem alguma outra sugestão?
c#
.net
uniqueidentifier
Noel
fonte
fonte
Respostas:
Este é bom - http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx
e também aqui o GUID do YouTube
Você pode usar Base64:
fonte
Eu uso uma abordagem semelhante à de Dor Cohen, mas removendo alguns caracteres especiais:
Isso produzirá apenas caracteres alfanuméricos. Não é garantido que os UIDs tenham sempre o mesmo comprimento. Aqui está um exemplo de execução:
fonte
Mantenha uma data de referência (que neste caso é 1º de janeiro de 2016) a partir de quando você começará a gerar esses ids. Isso tornará seus ids menores.
Número gerado: 3af3c14996e54
fonte
milliseconds
é sempre 0 para esseDateTime
objetoPacote de uso simples. Eu o uso para gerador de ID de solicitação temporal.
https://www.nuget.org/packages/shortid
https://github.com/bolorundurowb/shortid
Usos
System.Random
(da página do github)
Se você deseja controlar o tipo de id gerado especificando se deseja números, caracteres especiais e o comprimento, chame o método Generate e passe três parâmetros, o primeiro um booleano informando se deseja números, o segundo um booleano informando se deseja caracteres especiais, o último um número que indica sua preferência de comprimento.
fonte
Pelo que eu sei, apenas retirar uma parte de um GUID não é garantido como sendo único - na verdade, está longe de ser único.
A coisa mais curta que eu sei que garante exclusividade global é apresentada nesta postagem do blog de Jeff Atwood . Na postagem vinculada, ele discute várias maneiras de encurtar um GUID e, no final, reduz para 20 bytes por meio da codificação Ascii85 .
No entanto, se você precisa absolutamente de uma solução que não seja maior que 15 bytes, infelizmente você não tem outra escolha a não ser usar algo que não é garantido como único globalmente.
fonte
Os valores de IDENTITY devem ser únicos em um banco de dados, mas você deve estar ciente das limitações ... por exemplo, torna a inserção de dados em massa basicamente impossível, o que o tornará mais lento se estiver trabalhando com um número muito grande de registros.
Você também pode usar um valor de data / hora. Eu vi vários bancos de dados onde eles usam a data / hora para ser o PK e, embora não seja muito limpo - funciona. Se você controlar as inserções, poderá garantir com eficácia que os valores serão exclusivos no código.
fonte
Para meu aplicativo local, estou usando esta abordagem baseada no tempo:
fonte
aqui minha solução, não é segura para simultaneidade, não mais de 1000 GUIDs por segundos e thread-safe.
código não otimizado, apenas uma amostra !.
fonte
UtcNow
retornará um valor de escala exclusivo para cada milissegundo: de acordo com as observações , a resolução depende do cronômetro do sistema. Além disso, é melhor garantir que o relógio do sistema não mude para trás! (Como a resposta do usuário 13971889 colocou essa pergunta no topo do meu feed e eu critiquei essa resposta, acho que devo repetir essa crítica aqui.)Se seu aplicativo não tem alguns MILHÕES de pessoas, usando essa string única e curta no MESMO MILISEGUNDO, você pode pensar em usar a função abaixo.
altere yyyy para yy se você só precisar usar seu aplicativo nos próximos 99 anos.
Atualização 20160511 : Função aleatória correta
- Adicionar objeto de bloqueio
- Mover variável aleatória para fora da função RandomString
Ref
fonte
lock
é permitir que você reutilize a mesmaRandom
instância. Acho que você se esqueceu de deletar essa linha!Eu sei que está muito longe da data postada ... :)
Eu tenho um gerador que produz apenas 9 caracteres hexa, por exemplo: C9D6F7FF3, C9D6FB52C
fonte
Com base na resposta de @ dorcohen e no comentário de @pootzko. Você pode usar isso. É seguro durante o fio.
fonte
Jzhw2oVozkSNa2IkyK4ilA2
ou tente você mesmo em dotnetfiddle.net/VIrZ8jCom base em alguns outros, aqui está minha solução que fornece um guid codificado diferente que é seguro para URL (e Docker) e não perde nenhuma informação:
Os exemplos de saída são:
fonte
Em C # um
long
valor possui 64 bits, que se codificado com Base64, haverá 12 caracteres, incluindo 1 preenchimento=
. Se cortarmos o preenchimento=
, haverá 11 caracteres.Uma ideia maluca aqui é que poderíamos usar uma combinação de Unix Epoch e um contador para um valor de época para formar um
long
valor. O Unix Epoch em C #DateTimeOffset.ToUnixEpochMilliseconds
está nolong
formato, mas os primeiros 2 bytes dos 8 bytes são sempre 0, caso contrário, o valor de data e hora será maior que o valor máximo de data e hora. Isso nos dá 2 bytes para colocar umushort
contador.Portanto, no total, desde que o número de geração de IDs não exceda 65536 por milissegundo, podemos ter um ID único:
fonte
Uso
Não é ciência do foguete converter de volta, então vou deixar você por isso.
fonte
Se você não precisa digitar a string, pode usar o seguinte:
Isso converterá o Guid em uma string de 8 caracteres como esta:
{b77a49a5-182b-42fa-83a9-824ebd6ab58d} -> "䦥 띺 ᠫ 䋺 ꦃ ꦃ 亂 檽 趵"
{c5f8f7f5-8a7c-4511-b667-8ad36b446617} -> " 엸 詼 䔑 架 펊 䑫 ᝦ"
fonte
Este é o meu pequeno método para gerar um id único aleatório e curto. Usa um rng criptográfico para geração segura de números aleatórios. Adicione quaisquer caracteres que você precisa para a
chars
string.fonte
para não perder caracteres (+/-) e se quiser usar seu guid em uma url, deve ser transformado em base32
para 10.000.000 nenhuma chave duplicada
fonte
Você pode tentar a seguinte biblioteca:
fonte
fonte
UtcNow
retornará um valor de escala exclusivo para cada milissegundo: de acordo com as observações , a resolução depende do cronômetro do sistema. Além disso, é melhor garantir que o relógio do sistema não mude para trás! (a resposta de ur3an0 também tem esses problemas.)você pode usar
seus
6
única agradáveis personagens,599527
,143354
e quando o usuário virifica simplesmente
espero que isso ajude você
fonte
fonte
Eu uso
Guid.NewGuid().ToString().Split('-')[0]
, ele obtém o primeiro item do array separado por '-'. É o suficiente para representar uma chave única.fonte