Question

Je vois quitter quelques implémentations de génération de chaîne unique pour des choses comme les noms d'image téléchargée, ID de session, et al, et beaucoup d'entre elles emploient l'utilisation de hash comme SHA1, ou autres.

Je ne conteste pas la légitimité de l'utilisation de méthodes personnalisées comme celle-ci, mais plutôt que la raison. Si je veux une chaîne unique, je dis ceci:

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

Et je suis fait avec elle. Je n'étais pas faire confiance avant d'avoir lu sur UUID, donc je l'ai fait:

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

Pas un seul répéteur (je n'attendre un maintenant les chances envisage sont comme 1.108e + 50, mais il est réconfortant de le voir en action). Vous pouvez même la moitié des chances de simplement faire de votre chaîne en combinant 2 uuid4()s.

Donc, avec cela dit, pourquoi les gens passent du temps sur hasard () et d'autres choses pour les chaînes uniques, etc? Y at-il un important problème de sécurité ou d'autres en ce qui concerne UUID?

Était-ce utile?

La solution

L'utilisation d'un hachage pour identifier une ressource vous permet de générer une référence « unique » de l'objet. Par exemple, Git utilise hachage SHA pour faire un hachage unique qui représente l'exacte changeset d'un seul commit. Depuis hash est déterministe, vous obtiendrez le même hachage pour le même fichier à chaque fois.

Deux personnes à travers le monde pourraient faire le même changement à la même prise en pension indépendamment, et Git connaîtraient ils ont fait le même changement. UUID v1, v2 et v4 ne peut soutenir que, depuis qu'ils ont aucun rapport avec le fichier ou le contenu du fichier.

Autres conseils

Eh bien, parfois vous voulez des collisions. Si quelqu'un télécharge la même image exacte deux fois, vous auriez peut-être plutôt leur dire que c'est un double plutôt que de simplement faire une autre copie avec un nouveau nom.

Une raison possible est que vous voulez que la chaîne unique d'être lisible par l'homme. UUID juste ne sont pas faciles à lire.

sont longues UUID, et dénué de sens (par exemple, si vous commandez par UUID, vous obtenez un résultat vide de sens).

Et, parce qu'il est trop long, je ne voudrais pas le mettre dans une URL ou l'exposer à l'utilisateur sous une forme quelconque.

En plus des autres réponses, hash sont vraiment bons pour des choses qui devraient être immuables. Le nom est unique et peut être utilisé pour vérifier l'intégrité de ce qu'il est attaché à tout moment.

Notez également d'autres types de UUID pourraient même être approprié. Par exemple, si vous voulez que votre identifiant soit commandable, UUID1 est basée en partie sur un horodatage. Il est tout vraiment vos besoins d'application ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top