2010-06-12 10 views
2

Quelle est une bonne façon de convertir un chemin de fichier (URI) dans un System.Guid? Je voudrais minimiser la possibilité d'une collision, mais je suis heureux avec un hachage raisonnablement unique (probablement jamais plus de quelques douzaines/cent éléments dans la base de données)Convertir URI en GUID

Répondre

8

Il n'y a pas besoin. Hash URI avec md5 ou sha1 et c'est tout. Les GUID ne sont pas pour hacher les choses. Ils voulaient être créés uniques indépendamment de tout le reste.

+0

Appréciez la fessée, mais je dois les rééquiper dans un système qui dépend déjà de Guids. EDIT: ah, je vois md5 crée un nombre de 128 bits, ce qui équivaut à un guid. Je peux partir d'ici je pense. –

+1

Je ne suis pas sûr, mais je pense qu'il peut y avoir une collision avec les GUID "générés nativement" de cette façon si vous en générez beaucoup –

+0

salut, je suis intéressé de savoir quel programme OU comment convertir l'URI en md5 hash ? Y at-il un utilitaire quelque part dans VS? Merci! – VoodooChild

3

Si vous avez l'option d'un registre/base de données centralisé, vous pouvez gérer un résolveur d'URL GUID < -> et générer un nouveau GUID pour chaque URL dont vous avez besoin. Cela utiliserait les GUID de la manière prévue, réduisant la probabilité de collision avec les GUID générés de manière native.

+0

Michael, excellente suggestion. Je garderai cela à l'esprit au cas où je rencontrerais des problèmes avec le cryptage md5. –

7

La méthode "correcte" (selon RFC 4122 §4.3) consiste à créer un UUID basé sur le nom. L'avantage de cela (plutôt que d'utiliser un hachage MD5) est que ces derniers sont garantis de ne pas entrer en collision avec des UUID sans nom, et ont une (très) petite possibilité de collision avec d'autres UUID basés sur des noms.

Il n'y a pas de support natif dans le .NET Framework pour créer ceux-ci, mais en utilisant le code similar to this, vous pouvez créer un GUID comme suit:

Guid guid = GuidUtility.Create(GuidUtility.UrlNamespace, filePath); 

Pour réduire encore le risque de collisions avec d'autres GUIDs, vous pouvez créer un GUID privé à utiliser comme ID d'espace de nom (au lieu d'utiliser l'ID d'espace de noms d'URL défini dans la RFC).

+0

Notez que * similaire * est le mot clé en * similaire à ceci *. Si vous voulez que vos UUID correspondent au cas de test du RFC (qui, malheureusement, n'a qu'un seul test pour le type 3, et aucun pour le type 5), il est nécessaire de changer le code qui manipule 'newGuid [6]' manipuler 'newGuid [7]', et supprimer 'SwapByteOrder'. –

+0

@PeterTaylor: RFC4122 est incorrect et possède une errata qui corrige le code C (http://rfc-editor.org/errata_search.php?rfc=4122&eid=1352). Si cette implémentation n'est pas entièrement conforme à la RFC4122 et à ses errata, veuillez fournir plus de détails; Je voudrais le faire suivre la norme. –