2011-10-20 10 views
7

Muszę niezależnie obliczać skróty wielu bloków danych. Coś takiego:Czy stan HashAlgorithm.ComputeHash() jest stanowy?

using(HashAlgorithm hasher = new ActualHashAlgorithm()) { 
    for(int i = 0; i = numberOfBlocks; i++) { 
     byte[] block = getBlock(i); 
     byte[] hash = hasher.ComputeHash(block); 
     // use hash 
    } 
} 

Czy mogę używać tego samego obiektu HashAlgorithm między blokami? Czy HashAlgorithm przywróci stan między połączeniami do ComputeHash(), czy muszę usunąć obiekt HashAlgorithm i utworzyć nowy dla każdego nowego bloku danych?

Odpowiedz

2
-2

Właściwie, gdy potrzebna jest mieszanka w ramach architektury .NET, zdecydowanie zaleca się ręczne kodowanie tej funkcji, ale nie używanie platformy .NET.

Kilka miesięcy temu wyemigrowałem 32-bitowy program .NET do 64-bitowych okien. Program się zawiesił. Przynajmniej znalazłem wartość hash jest różna w różnych systemach 32/64-bitowych, chociaż ten sam program .NET. Użyłem algorytmu Djb zamiast algorytmu mieszania .NET, a program działa poprawnie.

Ten dokument dotyczy algorytmu skrótu Djb, można przepisać przez C#. To nie jest ciężka praca.

+2

zgadzam się z Tobą, że użycie 'object.GetHashCode()' nie powinny być wykorzystywane do tworzenia trwałych skrótów. Jednak wykorzystanie dobrze udokumentowanych algorytmów mieszania w przestrzeni nazw 'System.Security.Cryptography', takich jak' SHA256', nie doprowadzi do problemów, o których ostrzega. –

Powiązane problemy