Come sottolineato da Justin, un Guid dovrebbe essere unico ogni volta, mentre un hash darà sempre un risultato coerente per lo stesso valore.
Ora mi piacerebbe aggiungere a questo e dire che sia Guidi che gli hash (la maggior parte, se non tutti gli algoritmi) sono soggetti a collisioni, anche se il mio istinto è che l'hashing è soggetto a un livello maggiore di collisioni rispetto a Guids ... anche se questo potrebbe essere soggetto alle dimensioni dell'hash (cioè 128 bit, 256 bit, 512 bit, ecc.).
Un altro problema che si presenterà è che il byte[]
da un hash SHA1 è lungo 20 byte, mentre un Guid è lungo 16 byte, pertanto, la creazione di un Guid da un hash SHA1 non sarà accurata.
Esempio:
string myString = "Hello World";
SHA1 sha1 = SHA1CryptoServiceProvider.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = sha1.ComputeHash(myStringBytes);
Console.WriteLine(new Guid(hash.Take(16).ToArray()));
L'esempio precedente creerà un GUID dal hash, anche se utilizza LINQ per ottenere 16 byte dalla matrice hash (da cui l'inesattezza ... gli ultimi 4 byte sono semplicemente omesso)
MD5 è un hash da 16 byte, quindi sembra che potrebbe essere più adatto per la conversione a Guid di SHA1.
Esempio:
string myString = "Hello World";
MD5 md5 = MD5.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = md5.ComputeHash(myStringBytes);
Console.WriteLine(new Guid(hash));
Questo produce un accurato Guid dal hash MD5, anche se io stato, tutto questo è, è una rappresentazione GUID del hash MD5 ... non ci dovrebbe essere alcun effettivo modifica dei dati byte[]
.
Questo è un pò fuorviante in quanto un hash e un GUID sono cose diverse. Un guid dovrebbe darti una stringa unica/diversa ogni volta che richiedi un nuovo guid. Gli hash ti danno risultati coerenti basati sullo stesso input. – Justin
Sarà un GUID deterministico e ripetibile, basato su un hash, che intende generare valori univoci a seconda dell'input. Maggiori informazioni: http://waterjuice.org/2013/06/type-3-and-5-guids/ –
@Justin: stai fraintendendo ciò che l'OP sta chiedendo. Un GUID non è altro che un identificatore univoco globale; questo è ciò che GUID sta per. Esistono molti modi per generare un GUID. Ad esempio, è possibile creare un GUID in base all'ora e alla posizione correnti; questo è globalmente unico. (Principalmente). Questo è un GUID di tipo uno. È possibile creare un GUID statisticamente univoco con un generatore di numeri casuali; questo è un GUID di tipo quattro. Un hash crittograficamente forte ** di una stringa univoca ** è anche una fonte di univocità e può essere utilizzato per costruire un GUID. –