En nuestra aplicación, creamos archivos Xml con un atributo que tiene un valor Guid. Este valor debe ser coherente entre las actualizaciones de archivos. Entonces, incluso si todo lo demás en el archivo cambia, el valor guid para el atributo debería permanecer igual.Cómo crear guías deterministas
Una solución obvia era crear un diccionario estático con el nombre de archivo y las guías que se usarían para ellos. Luego, cada vez que generamos el archivo, buscamos el diccionario para el nombre del archivo y usamos el guid correspondiente. Pero esto no es factible porque podríamos escalar a cientos de archivos y no queríamos mantener una gran lista de guías.
Así que otro enfoque fue hacer que el Guid sea el mismo basado en la ruta del archivo. Dado que nuestras rutas de archivos y la estructura del directorio de la aplicación son únicas, el Guid debe ser exclusivo para esa ruta. Entonces, cada vez que ejecutamos una actualización, el archivo obtiene el mismo guid en función de su ruta. Encontré una buena manera de generar tal 'Deterministic Guids' (Gracias Elton Stoneman). Básicamente hace esto:
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;
}
Por lo tanto, dado una cadena, el Guid siempre será el mismo.
¿Hay otros enfoques o formas recomendadas de hacerlo? ¿Cuáles son los pros o los contras de ese método?
Estoy muy contento de haber encontrado esto, gracias por publicarlo. –
Tenga en cuenta que si bien esto es útil, la implementación no consigue que RFC4122 sea correcto, por lo que si intenta ser compatible con otra implementación, tendrá problemas (pruebe el ejemplo en el código C en el apéndice de RFC). – porges
@Porges: RFC4122 es incorrecto y tiene una errata que corrige el código C (http://www.rfc-editor.org/errata_search.php?rfc=4122&eid=1352). Si esta implementación no es totalmente compatible con RFC4122 y su errata, proporcione más detalles; Me gustaría hacer que siga el estándar. –