Pergunta

Eu vejo sair algumas implementações de geração string única para coisas como nomes Envio de imagem, IDs de sessão, et al, e muitos deles empregam o uso de hashes SHA1 como, ou outros.

Eu não estou questionando a legitimidade da utilização de métodos personalizados como este, mas sim apenas a razão. Se eu quiser uma cadeia exclusiva, eu só digo isto:

>>> import uuid
>>> uuid.uuid4()
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d')

E eu sou feito com ele. Eu não estava muito confiante antes de eu ler sobre uuid, então eu fiz o seguinte:

>>> import uuid
>>> s = set()
>>> for i in range(5000000):  # That's 5 million!
>>>     s.add(str(uuid.uuid4()))
...
...
>>> len(s)
5000000

Nem um repetidor (eu não esperaria um agora considerando as chances são como 1.108e + 50, mas é reconfortante vê-lo em ação). Você poderia até metade das probabilidades de apenas fazendo a seqüência combinando 2 uuid4()s.

Assim, com o que disse, por que as pessoas gastam tempo na random () e outras coisas para cordas únicas, etc? Existe um problema de segurança importante ou outra sobre uuid?

Foi útil?

Solução

Usando um hash para identificar exclusivamente um recurso permite gerar uma referência 'único' do objeto. Por exemplo, Git usa SHA hash para fazer um hash exclusivo que representa o conjunto de alterações exata de um único a cometer. Desde hashing é determinística, você vai ter o mesmo hash para o mesmo arquivo de cada vez.

Duas pessoas em todo o mundo poderia fazer a mesma alteração para o mesmo repo independente, e Git saberia que eles fizeram a mesma alteração. UUID v1, v2 e v4 não pode suportar que desde que eles não têm relação com o arquivo ou o conteúdo do arquivo.

Outras dicas

Bem, às vezes você quer colisões. Se alguém carrega a mesma imagem exata duas vezes, talvez você prefira dizer-lhes que é uma duplicata em vez de apenas fazer uma outra cópia com um novo nome.

Uma possível razão é que você quer a string única para ser legível. UUIDs simplesmente não são fáceis de ler.

UUIDs são longos e sem sentido (por exemplo, se você pedir por UUID, você obter um resultado sem sentido).

E, porque é muito tempo, eu não gostaria de colocá-lo em uma URL ou expô-lo ao usuário em qualquer forma ou formulário.

Além das outras respostas, hashes são realmente bons para as coisas que devem ser imutáveis. O nome é exclusivo e pode ser usado para verificar a integridade de tudo o que está ligado a qualquer momento.

Observe também outros tipos de UUID pode até ser apropriado. Por exemplo, se você quiser que o seu identificador ser orderable, UUID1 é baseado em parte em um timestamp. É tudo muito sobre o seu requisitos de aplicação ...

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