Dans notre application, nous créons des fichiers Xml avec un attribut qui a une valeur Guid. Cette valeur devait être cohérente entre les mises à niveau de fichiers. Ainsi, même si tout le reste du fichier change, la valeur guid de l'attribut doit rester la même.
Une solution évidente était de créer un dictionnaire statique avec le nom de fichier et les Guids à utiliser pour eux. Ensuite, chaque fois que nous générons le fichier, nous recherchons dans le dictionnaire le nom de fichier et utilisons le guid correspondant. Mais ce n'est pas faisable car nous pourrions passer à des centaines de fichiers et ne voulions pas maintenir une grande liste de guides.
Une autre approche consistait donc à rendre le Guid identique en fonction du chemin du fichier. Étant donné que nos chemins de fichiers et notre structure de répertoires d'application sont uniques, le Guid doit être unique pour ce chemin. Ainsi, chaque fois que nous exécutons une mise à niveau, le fichier obtient le même GUID en fonction de son chemin. J'ai trouvé un moyen sympa de générer de tels « guides déterministes » (merci Elton Stoneman). Il fait essentiellement ceci:
private Guid GetDeterministicGuid(string input)
{
//use MD5 hash to get a 16-byte hash of the string:
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] hashBytes = provider.ComputeHash(inputBytes);
//generate a guid from the hash:
Guid hashGuid = new Guid(hashBytes);
return hashGuid;
}
Donc, étant donné une chaîne, le Guid sera toujours le même.
Y a-t-il d'autres approches ou moyens recommandés pour y parvenir? Quels sont les avantages ou les inconvénients de cette méthode?