Pergunta

Eu criar um GUID (como uma string) e obter o hash dele. Posso considerar este hash para ser único?

Foi útil?

Solução

Não é tão confiável único como o próprio GUID, não.

Apenas para expandir, você está reduzindo sua singularidade por um fator de 4, passando de 16 bytes para 4 bytes de combinações possíveis.

Como apontado nos comentários o tamanho de hash vai fazer a diferença. A coisa 4 byte era um pressuposto, na melhor das hipóteses terrível Sei, que pode ser usado em NET, onde o tamanho de hash padrão é de 4 bytes (int). Assim, você pode substituir o que eu disse acima com qualquer tamanho em bytes sua mistura pode ser.

Outras dicas

Não.

Veja aqui, se você quiser um mini GUID: http: //blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

Em uma palavra, não.

Vamos supor que o seu haxixe tem menos bits do que o GUID, por princípio o buraco pombo, deve existir mais de um mapeamento de alguns GUID -> haxixe simplesmente porque há menos hashes que GUIDS.

Se assumirmos que o hash tem um número maior de bits do que o GUID, há um muito pequeno - mas finito -. Chance de uma colisão, supondo que você está usando uma função de hash boa

função hash Sem que reduz um bloco de dados de tamanho arbitrário para um número de tamanho fixo de bits irão produzir um mapeamento um-para-um entre os dois. Haverá sempre existe a possibilidade de ter dois blocos de dados diferentes ser reduzida para a mesma sequência de bits no hash.

Os bons algoritmos de hash minimiza a probabilidade de isso acontecer e, em geral, os mais bits do hash, menor a chance de uma colisão.

de não guranteed a ser, devido à de hash colisões . O GUID em si é quase garantido para ser.

Por razões práticas, você provavelmente pode supor que um hash é único, mas por que não usar o próprio GUID?

Não, e eu não iria assumir singularidade de qualquer valor hash. Isso deve não importa porque os valores de hash não precisa único, eles só precisam de distribuídos uniformemente em toda a sua gama. O mais uniforme a distribuição, as menos colisões ocorrem (na tabela de dispersão). colisões menos significa melhor desempenho hashtable.

FYI para uma boa descrição de como tabelas de hash trabalho, ler a resposta aceita a Quais são hashtables e HashMaps e seus casos de uso típicos?

Se você usar hash criptográfico (MD5, SHA1, RIPEMD160), o hash será único (colisões modulo que são muito improvável - SHA1 é usado por exemplo, para assinaturas digitais, e MD5 é também colisão resistente em aleatória entradas ). Embora, por que você quer de hash um GUID?

Gostaria de hash de um GUID para o tamanho X com a percepção de que às vezes eu tenho 10 ou menos GUIDS em conjunto para que eu possa sair com um hash mais curto, sem colisão do que se eu tiver 10.000.000 GUID em um conjunto. Eu apenas gostaria de ser capaz de especificar o tamanho do hash quando eu chamar a função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top