2011-11-06 8 views
15

Powiel możliwe:
How do I create a HashCode in .net (c#) for a string that is safe to store in a database?Czy funkcja mieszania ciągów .NET jest przenośna?

używam C# 4.0 i dostaje hash ciąg powołując:

"my string".GetHashCode() 

Kod generowany przez tego połączenia są przechowywane w bazie danych do przyszłości posługiwać się. Ten kod skrótu służy do znajdowania pewnego podzestawu łańcuchów, a następnie do równego porównania.

Pytania są następujące:

  1. Czy jest to standaryzowany obliczenia mieszania? Czy mogę założyć, że możliwe jest obliczenie tego samego skrótu w różnych środowiskach, takich jak C# w .Net 3.0 lub przyszłych edycjach .Net?
  2. Czy jest możliwe obliczenie tej samej funkcji skrótu dla siebie przez napisanie jej w Javie, PL/SQL, Ruby, itp?
  3. Czy mogę założyć, że wygenerowany dzisiaj skrót będzie taki sam jutro w w tym samym środowisku? Na przykład, kiedy wyłączam mój komputer i ponownie uruchomić program, zmienić ustawienia regionalne lub inne ustawienia?
  4. Jakie są ograniczenia możliwości przenoszenia?
  5. Wiem, że mogę to zrobić samemu, ale może jest zapewniona przenośność?
+13

Odpowiedzi na twoje pytania brzmią: NIE, NIE, NIE, NIE, NIE, nie ma żadnej "przenośności", i nie ma żadnej "przenośności" jakiejkolwiek. ** Pod żadnym pozorem nie powinieneś robić tego, co opisujesz. ** –

Odpowiedz

18

Od MSDN:

Domyślna implementacja metody GetHashCode nie gwarantuje unikalne wartości zwracane dla różnych obiektów. Ponadto .NET Framework nie gwarantuje domyślnej implementacji metody GetHashCode, a zwracana wartość będzie taka sama w różnych wersjach .NET Framework. W związku z tym domyślna implementacja tej metody nie może być używana jako unikalny identyfikator obiektu dla celów mieszania.

Nie można więc założyć, że wartość wyprodukowana przez GetHashCode jest stabilna. To nie tylko teoretyczne - we've seen the value change in the past.

Jeśli chcesz uzyskać stabilny skrót, musisz wygenerować go samodzielnie.

+0

"Domyślna implementacja" - czy 'String' używa domyślnej implementacji? Szczerze mówiąc, nie wiem, po prostu nie spodziewałbym się tego (ponieważ są one traktowane wartością w tablicach hash). – delnan

+3

'System.String' nadpisuje' GetHashCode' i zawiera podobną notatkę w [jego dokumentacji] (http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx): * Zachowanie kodu GetHashCode zależy od jego implementacji, która może ulec zmianie z jednej wersji środowiska wykonawczego wspólnego języka na inną. Przyczyną takiego stanu rzeczy jest poprawa wydajności GetHashCode. * I * Wartość zwrócona przez GetHashCode zależy od platformy. Różni się on w 32-bitowych i 64-bitowych wersjach .NET Framework. * –

2

Nie. Nie jest przenośny. Powinieneś nigdy nie używać tej metody do niczego innego niż równoważenia drzewa hash. jego implementacja zmieniła się między wersjami Framework i zachowuje się inaczej w przypadku 32-bitowego/64-bitowego CLR.

Eric Lippert ma blog post reguł i prawidłowego wykorzystania dla tej funkcji.

Zamiast tego powinieneś używać SHA1Managed do wstawiania skrótu do bazy danych.