2011-11-18 24 views
5

Przede wszystkim, aby było jasne, zdaję sobie sprawę, że w języku C++ istnieje ogromna liczba implementacji MD5. Problem polega na tym, że zastanawiam się, czy istnieje porównanie, która implementacja jest szybsza od innych. Ponieważ używam tej funkcji skrótu MD5 dla plików większych niż 10 GB, istotną kwestią jest tutaj prędkość.Szybka implementacja MD5 w C++

+11

Masz te supernowoczesne, szybsze niż dyski SSD, prawda? – avakar

+0

To [pytanie] (http://stackoverflow.com/questions/2717216/what-hash-algorithms-are-parallelizable-optimizing-the-hashing-of-large-files-u) może pomóc. Chciałem zasugerować coś, co można zrównoleglić, ale przypuszczam, że zależy to od sposobu przechowywania danych. – Vlad

+0

@avakar: Jeśli dane są replikowane, powinno być co najmniej prawdopodobne, aby przyspieszyć obliczenia, uruchamiając je równolegle z różnych replik, jeśli system na to zezwoli. – Vlad

Odpowiedz

9

myślę punkt avakar stara się zrobić to: z nowoczesnej mocy przetwarzania prędkości IO twój dysk twardy jest wąskim gardłem, a nie obliczaniem hasza. Uzyskanie bardziej wydajnego algorytmu nie pomoże, ponieważ to nie jest (najprawdopodobniej) najwolniejszy punkt.

Jeśli robisz coś specjalnego (na przykład 1000 rund), to może być inaczej, ale jeśli właśnie obliczasz skrót pliku. Musisz przyspieszyć swoje IO, a nie matematykę.

2

Jestem pewien, że istnieje wiele adaptacji CUDA/OpenCL algorytmu, które powinny dać ci zdecydowane przyspieszenie. Możesz także wziąć podstawowy algorytm i trochę pomyśleć -> uruchom implementację CUDA/OpenCL.

Szyfry blokowe są idealnymi kandydatami do tego typu realizacji.

Można również uzyskać jego implementację C i pobrać kopię kompilatora Intel C i zobaczyć, jak to dobrze. Rozszerzenia wektorowania w procesorach Intela są niesamowite pod względem zwiększenia prędkości.

3

Nie sądzę, że ma to duże znaczenie (na tym samym sprzęcie, ale w rzeczywistości GPGPU-y to inny, a może i szybszy sprzęt do tego rodzaju problemu). Główną częścią md5 jest dość złożona pętla złożonych operacji arytmetycznych. Liczy się jakość optymalizacji kompilatora.

Ważne jest również, jak czytasz ten plik. W systemie Linux istotne mogą być mmap i madvise i readahead. Szybkość dysku jest prawdopodobnie wąskim gardłem (użyj dysku SSD, jeśli możesz).

Czy jesteś pewien, że chcesz specjalnie md5? Istnieją prostsze i szybsze algorytmy kodowania hash (md4 itd.). Wciąż twój problem jest bardziej związany z I/O niż z CPU.