Jak zauważył Justin, Guid powinien być niepowtarzalny za każdym razem, podczas gdy hash da spójny wynik za każdym razem dla tej samej wartości.
Teraz chciałbym dodać do tego i powiedzieć, że zarówno Guidy, jak i skróty (większość, jeśli nie wszystkie algorytmy) są podatne na kolizje, chociaż moim zdaniem jest to, że mieszanie podlega wyższemu poziomowi kolizji niż Guids ... chociaż może to być uzależnione od wielkości skrótu (np. 128 bitów, 256 bitów, 512 bitów itd.).
Innym problemem, jaki napotkasz, jest to, że byte[]
z sumy SHA1 ma 20 bajtów długości, podczas gdy Guid ma 16 bajtów długości, dlatego tworzenie Guida ze skrótu SHA1 nie będzie dokładne.
Przykład:
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()));
Powyższy przykład stworzy Guid z hash, choć używa LINQ, aby uzyskać 16 bajtów z tablicy mieszającej (stąd nieścisłości ... ostatnie 4 bajty są po prostu pominięty)
MD5 jest 16-bajtowym hash, więc wydaje się, że może być bardziej odpowiedni do konwersji na Guid niż SHA1.
Przykład:
string myString = "Hello World";
MD5 md5 = MD5.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = md5.ComputeHash(myStringBytes);
Console.WriteLine(new Guid(hash));
To daje dokładny Guid z mieszania MD5, chociaż będę stwierdzić, to wszystko, to reprezentacja GUID hash MD5 ... nie powinno być rzeczywiste zmienić w danych byte[]
.
To jest trochę mylące, ponieważ hash i guid to dwie różne rzeczy. Guid powinien dać ci unikalny/inny ciąg za każdym razem, gdy poprosisz o nowy Guid. Hashy dają spójne wyniki na podstawie tego samego wejścia. – Justin
Będzie to deterministyczny i powtarzalny identyfikator GUID, oparty na haśle, który ma generować unikalne wartości w zależności od danych wejściowych. Więcej informacji: http://waterjuice.org/2013/06/type-3-and-5-guids/ –
@Justin: Nie rozumiesz, o co chodzi w PO. Identyfikator GUID jest niczym więcej niż globalnie unikalnym identyfikatorem; to jest to, co oznacza GUID. Istnieje wiele sposobów generowania identyfikatora GUID. Można na przykład utworzyć identyfikator GUID na podstawie bieżącego czasu i pozycji; to jest globalnie wyjątkowe. (Głównie.) To jest typ GUID. Można utworzyć identyfikator GUID, który jest statystycznie unikalny w przypadku generatora liczb losowych; to jest identyfikator GUID typu 4. Mocny kryptograficznie hash ** unikatowego ciągu znaków ** jest również źródłem unikalności i można go wykorzystać do skonstruowania GUID. –