Najszybszy hash do zastosowań niekryptograficznych?

154

Zasadniczo przygotowuję frazy do umieszczenia w bazie danych, mogą być zniekształcone, więc zamiast tego chcę przechowywać ich krótki skrót (będę po prostu porównywał, czy istnieją, czy nie, więc hash jest idealny).

Zakładam, że MD5 jest dość powolny w przypadku ponad 100 000 żądań, więc chciałem wiedzieć, jaka byłaby najlepsza metoda haszowania fraz, może wdrożenie własnej funkcji skrótu lub użycie hash('md4', '...'będzie szybsze?

Wiem, że MySQL ma MD5 (), więc może to uzupełnić nieco szybkość po zakończeniu zapytania, ale może jest jeszcze szybsza funkcja mieszająca w MySQL, o której nie wiem, że działałaby z PHP.

Jan
źródło
6
Co powstrzymuje Cię przed testowaniem skrótów?
NullUserException
3
NullUserException: Masz rację, spróbuję ich z frazami o losowej długości. Chciałem tylko wglądu w to, jaka byłaby norma, jeśli w ogóle byśmy poradzili sobie z tego rodzaju rzeczami.
John
5
MD5 nie jest tak powolne ...
Amber,
25
czy na pewno funkcja haszująca jest wąskim gardłem całej aplikacji? Wątpię, że tak
Twój zdrowy rozsądek
4
Jest to bardzo dobre pytanie, a komentarze sugerujące, że nie jest lub jest nieważne i / lub powinny być oczywiste i / lub intuicyjne - są rozczarowujące i frustrujące. (A także wcale nieoczekiwane.)
michael

Odpowiedzi:

56

CRC32 jest dość szybki i jest do tego funkcja: http://www.php.net/manual/en/function.crc32.php

Ale powinieneś być świadomy, że CRC32 będzie miał więcej kolizji niż skróty MD5 lub nawet SHA-1, po prostu z powodu zmniejszonej długości (32 bity w porównaniu do 128 bitów i odpowiednio 160 bitów). Ale jeśli chcesz tylko sprawdzić, czy przechowywany ciąg jest uszkodzony, wystarczy CRC32.

joschi
źródło
1
Wow, tylko wymagany typ danych to liczba całkowita bez znaku, będzie to ZNACZĄCO szybsze niż inne haszowanie.
John,
2
@John: czy nie. Okazuje się, że CRC32 jest wolniejszy niż MD4 i niewiele szybszy niż MD5 na procesorach ARM. Poza tym CRC32 używa 32-bitowej liczby całkowitej bez znaku, czyli dokładnie tego, czego potrzebuje MD5 ...
Thomas Pornin
3
jeśli masz zalety / luksus nowszego procesora Intela, istnieje polecenie asemblera crc32c, które jest ... prawdopodobnie bardzo szybkie (chociaż nie jest to tradycyjna wartość crc32). Zobacz także xxhash code.google.com/p/xxhash
rogerdpack
146
fcn     time  generated hash
crc32:  0.03163  798740135
md5:    0.0731   0dbab6d0c841278d33be207f14eeab8b
sha1:   0.07331  417a9e5c9ac7c52e32727cfd25da99eca9339a80
xor:    0.65218  119
xor2:   0.29301  134217728
add:    0.57841  1105

Kod użyty do wygenerowania tego to:

 $loops = 100000;
 $str = "ana are mere";

 echo "<pre>";

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = crc32($str);
 }
 $tse = microtime(true);
 echo "\ncrc32: \t" . round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = md5($str);
 }
 $tse = microtime(true);
 echo "\nmd5: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $x = sha1($str);
 }
 $tse = microtime(true);
 echo "\nsha1: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0x77;
  for($j=0;$j<$l;$j++){
   $x = $x xor ord($str[$j]);
  }
 }
 $tse = microtime(true);
 echo "\nxor: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0x08;
  for($j=0;$j<$l;$j++){
   $x = ($x<<2) xor $str[$j];
  }
 }
 $tse = microtime(true);
 echo "\nxor2: \t".round($tse-$tss, 5) . " \t" . $x;

 $tss = microtime(true);
 for($i=0; $i<$loops; $i++){
  $l = strlen($str);
  $x = 0;
  for($j=0;$j<$l;$j++){
   $x = $x + ord($str[$j]);
  }
 }
 $tse = microtime(true);
 echo "\nadd: \t".round($tse-$tss, 5) . " \t" . $x;
Quamis
źródło
3
Ach, dziękuję za ten wgląd, tylko wzmacnia moje użycie CRC32, będąc najszybszym.
John
@John - Można pobierać mieszania algorytmy przy użyciu: hash_algos(). Poniższy kod testowania skrótów znajdował się w komentarzach PHP ==> codepad.viper-7.com/5Wdhw6
Peter
Dziękuję za Twój kod. Trochę to poprawiłem. Nie sądzę, że powinniśmy porównywać funkcje, takie jak md5 (), które przetwarzają cały łańcuch i pętle, które wykonują bajt po bajcie, tak jak utworzono za pomocą xor. W PHP te pętle są bardzo wolne, a nawet wolniejsze niż sam md5. Powinniśmy porównać jedno z drugim, wszystkie zaimplementowane jako funkcje.
Maxim Masiutin
1
Krótka uwaga - próbowałem tego ze znacznie dłuższym ciągiem (~ 5000 znaków) i CRC32 był wolniejszy niż MD5 i SHA1 na moim komputerze (i7-6650U, 16 GB). CRC32 - 1,7s, MD5 - 1,4s, SHA1 - 1,5s. Zawsze testuj sam.
Sam Tolton,
4
@Quamis test jest fajny, ale może wprowadzać w błąd - jak zauważył @samTolton, wyniki są inne i md5są szybsze. Lepszym testem będzie również losowanie zawartości i długości ciągów. w ten sposób uzyskujemy lepszy obraz rzeczywistej wydajności w świecie rzeczywistym. Pozwoli to również uniknąć buforowania. Spójrz: wydajność sumy kontrolnej haszowania php
Shlomi Hassid
43

Lista rankingowa, w której każda pętla ma to samo do szyfrowania, co wszystkie inne.

<?php

set_time_limit(720);

$begin = startTime();
$scores = array();


foreach(hash_algos() as $algo) {
    $scores[$algo] = 0;
}

for($i=0;$i<10000;$i++) {
    $number = rand()*100000000000000;
    $string = randomString(500);

    foreach(hash_algos() as $algo) {
        $start = startTime();

        hash($algo, $number); //Number
        hash($algo, $string); //String

        $end = endTime($start);

        $scores[$algo] += $end;
    }   
}


asort($scores);

$i=1;
foreach($scores as $alg => $time) {
    print $i.' - '.$alg.' '.$time.'<br />';
    $i++;
}

echo "Entire page took ".endTime($begin).' seconds<br />';

echo "<br /><br /><h2>Hashes Compared</h2>";

foreach($scores as $alg => $time) {
    print $i.' - '.$alg.' '.hash($alg,$string).'<br />';
    $i++;
}

function startTime() {
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   return $mtime;   
}

function endTime($starttime) {
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $endtime = $mtime; 
   return $totaltime = ($endtime - $starttime); 
}

function randomString($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $string = '';    
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters) - 1)];
    }
    return $string;
}

?>

I wyjście

1 - crc32b 0.111036300659
2 - crc32 0.112048864365
3 - md4 0.120795726776
4 - md5 0.138875722885
5 - sha1 0.146368741989
6 - adler32 0.15501332283
7 - tiger192,3 0.177447080612
8 - tiger160,3 0.179498195648
9 - tiger128,3 0.184012889862
10 - ripemd128 0.184052705765
11 - ripemd256 0.185411214828
12 - salsa20 0.198500156403
13 - salsa10 0.204956293106
14 - haval160,3 0.206098556519
15 - haval256,3 0.206891775131
16 - haval224,3 0.206954240799
17 - ripemd160 0.207638263702
18 - tiger192,4 0.208125829697
19 - tiger160,4 0.208438634872
20 - tiger128,4 0.209359407425
21 - haval128,3 0.210256814957
22 - sha256 0.212738037109
23 - ripemd320 0.215386390686
24 - haval192,3 0.215610980988
25 - sha224 0.218329429626
26 - haval192,4 0.256464719772
27 - haval160,4 0.256565093994
28 - haval128,4 0.257113456726
29 - haval224,4 0.258928537369
30 - haval256,4 0.259262084961
31 - haval192,5 0.288433790207
32 - haval160,5 0.290239810944
33 - haval256,5 0.291721343994
34 - haval224,5 0.294484138489
35 - haval128,5 0.300224781036
36 - sha384 0.352449893951
37 - sha512 0.354603528976
38 - gost 0.392376661301
39 - whirlpool 0.629067659378
40 - snefru256 0.829529047012
41 - snefru 0.833986997604
42 - md2 1.80192279816
Entire page took 22.755341053 seconds


Hashes Compared

1 - crc32b 761331d7
2 - crc32 7e8c6d34
3 - md4 1bc8785de173e77ef28a24bd525beb68
4 - md5 9f9cfa3b5b339773b8d6dd77bbe931dd
5 - sha1 ca2bd798e47eab85655f0ce03fa46b2e6e20a31f
6 - adler32 f5f2aefc
7 - tiger192,3 d11b7615af06779259b29446948389c31d896dee25edfc50
8 - tiger160,3 d11b7615af06779259b29446948389c31d896dee
9 - tiger128,3 d11b7615af06779259b29446948389c3
10 - ripemd128 5f221a4574a072bc71518d150ae907c8
11 - ripemd256 bc89cd79f4e70b73fbb4faaf47a3caf263baa07e72dd435a0f62afe840f5c71c
12 - salsa20 91d9b963e172988a8fc2c5ff1a8d67073b2c5a09573cb03e901615dc1ea5162640f607e0d7134c981eedb761934cd8200fe90642a4608eacb82143e6e7b822c4
13 - salsa10 320b8cb8498d590ca2ec552008f1e55486116257a1e933d10d35c85a967f4a89c52158f755f775cd0b147ec64cde8934bae1e13bea81b8a4a55ac2c08efff4ce
14 - haval160,3 27ad6dd290161b883e614015b574b109233c7c0e
15 - haval256,3 03706dd2be7b1888bf9f3b151145b009859a720e3fe921a575e11be801c54c9a
16 - haval224,3 16706dd2c77b1888c29f3b151745b009879a720e4fe921a576e11be8
17 - ripemd160 f419c7c997a10aaf2d83a5fa03c58350d9f9d2e4
18 - tiger192,4 112f486d3a9000f822c050a204d284d52473f267b1247dbd
19 - tiger160,4 112f486d3a9000f822c050a204d284d52473f267
20 - tiger128,4 112f486d3a9000f822c050a204d284d5
21 - haval128,3 9d9155d430218e4dcdde1c62962ecca3
22 - sha256 6027f87b4dd4c732758aa52049257f9e9db7244f78c132d36d47f9033b5c3b09
23 - ripemd320 9ac00db553b51662826267daced37abfccca6433844f67d8f8cfd243cf78bbbf86839daf0961b61d
24 - haval192,3 7d706dd2d37c1888eaa53b154948b009e09c720effed21a5
25 - sha224 b6395266d8c7e40edde77969359e6a5d725f322e2ea4bd73d3d25768
26 - haval192,4 d87cd76e4c8006d401d7068dce5dec3d02dfa037d196ea14
27 - haval160,4 f2ddd76e156d0cd40eec0b8d09c8f23d0f47a437
28 - haval128,4 f066e6312b91e7ef69f26b2adbeba875
29 - haval224,4 1b7cd76ea97c06d439d6068d7d56ec3d73dba0373895ea14e465bc0e
30 - haval256,4 157cd76e8b7c06d432d6068d7556ec3d66dba0371c95ea14e165bc0ec31b9d37
31 - haval192,5 05f9ea219ae1b98ba33bac6b37ccfe2f248511046c80c2f0
32 - haval160,5 e054ec218637bc8b4bf1b26b2fb40230e0161904
33 - haval256,5 48f6ea210ee1b98be835ac6b7dc4fe2f39841104a37cc2f06ceb2bf58ab4fe78
34 - haval224,5 57f6ea2111e1b98bf735ac6b92c4fe2f43841104ab7cc2f076eb2bf5
35 - haval128,5 ccb8e0ac1fd12640ecd8976ab6402aa8
36 - sha384 bcf0eeaa1479bf6bef7ece0f5d7111c3aeee177aa7990926c633891464534cd8a6c69d905c36e882b3350ef40816ed02
37 - sha512 8def9a1e6e31423ef73c94251d7553f6fe3ed262c44e852bdb43e3e2a2b76254b4da5ef25aefb32aae260bb386cd133045adfa2024b067c2990b60d6f014e039
38 - gost ef6cb990b754b1d6a428f6bb5c113ee22cc9533558d203161441933d86e3b6f8
39 - whirlpool 54eb1d0667b6fdf97c01e005ac1febfacf8704da55c70f10f812b34cd9d45528b60d20f08765ced0ab3086d2bde312259aebf15d105318ae76995c4cf9a1e981
40 - snefru256 20849cbeda5ddec5043c09d36b2de4ba0ea9296b6c9efaa7c7257f30f351aea4
41 - snefru 20849cbeda5ddec5043c09d36b2de4ba0ea9296b6c9efaa7c7257f30f351aea4
42 - md2 d4864c8c95786480d1cf821f690753dc
Pez Cuckow
źródło
4
Na końcu pojawia się minimalny błąd poza jednym. strlen($characters)powinno być strlen($characters) - 1:)
MM.
29

Na stronie xxhash jest porównanie prędkości. Skopiuj, wklejając tutaj:

 Name            Speed       Q.Score   Author
 xxHash          5.4 GB/s     10
 MumurHash 3a    2.7 GB/s     10       Austin Appleby
 SpookyHash      2.0 GB/s     10       Bob Jenkins
 SBox            1.4 GB/s      9       Bret Mulvey
 Lookup3         1.2 GB/s      9       Bob Jenkins
 CityHash64      1.05 GB/s    10       Pike & Alakuijala
 FNV             0.55 GB/s     5       Fowler, Noll, Vo
 CRC32           0.43 GB/s     9
 MD5-32          0.33 GB/s    10       Ronald L. Rivest
 SHA1-32         0.28 GB/s    10

Wydaje się więc, że xxHash jest zdecydowanie najszybszy, podczas gdy wiele innych pokonuje starsze skróty, takie jak CRC32, MD5 i SHA.

https://code.google.com/p/xxhash/

Zauważ, że jest to kolejność kompilacji 32-bitowej. W przypadku kompilacji 64-bitowej kolejność wydajności jest prawdopodobnie bardzo różna. Niektóre skróty są w dużej mierze oparte na 64-bitowych mnożeniach i pobieraniu.

hdante
źródło
17
+-------------------+---------+------+--------------+
|       NAME        |  LOOPS  | TIME |     OP/S     |
+-------------------+---------+------+--------------+
| sha1ShortString   | 1638400 | 2.85 | 574,877.19   |
| md5ShortString    | 2777680 | 4.11 | 675,834.55   |
| crc32ShortString  | 3847980 | 3.61 | 1,065,922.44 |
| sha1MediumString  | 602620  | 4.75 | 126,867.37   |
| md5MediumString   | 884860  | 4.69 | 188,669.51   |
| crc32MediumString | 819200  | 4.85 | 168,907.22   |
| sha1LongString    | 181800  | 4.95 | 36,727.27    |
| md5LongString     | 281680  | 4.93 | 57,135.90    |
| crc32LongString   | 226220  | 4.95 | 45,701.01    |
+-------------------+---------+------+--------------+

Wydaje się, że crc32 jest szybszy dla małych wiadomości (w tym przypadku 26 znaków), a md5 dla dłuższych wiadomości (w tym przypadku> 852 znaków).

Aalex Gabi
źródło
17

Aktualizacja 2019: ta odpowiedź jest najbardziej aktualna. Biblioteki wspierające szmery są w dużej mierze dostępne we wszystkich językach.

Obecnie zaleca się używanie rodziny Murmur Hash (patrz konkretnie warianty murmur2 lub murmur3 ).

Hashy szmerów zostały zaprojektowane do szybkiego mieszania z minimalnymi kolizjami (znacznie szybciej niż CRC, MDx i SHAx). Jest to idealne rozwiązanie do wyszukiwania duplikatów i bardzo odpowiednie dla indeksów HashTable.

W rzeczywistości jest używany przez wiele nowoczesnych baz danych (Redis, ElastisSearch, Cassandra) do obliczania wszelkiego rodzaju skrótów do różnych celów. Ten konkretny algorytm był głównym źródłem wielu ulepszeń wydajności w bieżącej dekadzie.

Jest również używany we wdrożeniach Bloom Filters . Powinieneś być świadomy, że jeśli szukasz "szybkich haszów", prawdopodobnie masz do czynienia z typowym problemem, który jest rozwiązywany przez filtry Blooma. ;-)

Uwaga : szmer jest hashem ogólnego przeznaczenia, co oznacza, że ​​NIE jest kryptograficzny. Nie przeszkadza w znalezieniu źródłowego „tekstu”, który wygenerował hash. NIE jest właściwe haszowanie haseł.

Więcej szczegółów: MurmurHash - co to jest?

user5994461
źródło
2
Jest tutaj otwarta prośba o dodanie szmera do php, na którą możesz głosować.
keune
8

Zamiast zakładać, że MD5 działa „dość wolno”, spróbuj. Prosta implementacja MD5 oparta na języku C na prostym komputerze (mój, 2,4 GHz Core2, wykorzystujący pojedynczy rdzeń) może haszować 6 milionów małych wiadomości na sekundę . Mała wiadomość ma tutaj do 55 bajtów. W przypadku dłuższych wiadomości szybkość mieszania MD5 jest liniowa w stosunku do rozmiaru wiadomości, tj. Przetwarza dane z szybkością około 400 megabajtów na sekundę. Możesz zauważyć, że jest to czterokrotnie większa prędkość niż maksymalna prędkość dobrego dysku twardego lub gigabitowej karty sieciowej Ethernet.

Ponieważ mój komputer ma cztery rdzenie, oznacza to, że haszowanie danych tak szybko, jak mój dysk twardy może dostarczyć lub odebrać, zużywa maksymalnie 6% dostępnej mocy obliczeniowej. Potrzeba bardzo specjalnej sytuacji, aby prędkość mieszania stała się wąskim gardłem lub nawet spowodowała zauważalny koszt na komputerze.

Na znacznie mniejszych architekturach, w których prędkość mieszania może być nieco istotna, możesz użyć MD4. MD4 jest w porządku do celów niekryptograficznych (a do celów kryptograficznych i tak nie powinieneś używać MD5). Donoszono, że MD4 jest nawet szybszy niż CRC32 na platformach opartych na ARM.

Thomas Pornin
źródło
Jest coś do rozważenia. MD5 zajmuje 128 bitów zamiast 32. Oznacza to, że przechowywanie bazy danych zajmuje 4 razy więcej miejsca, a zatem 4 razy wolniej wyszukuje w celu porównania skrótów (tak mi się wydaje ). Martwię się (do moich zastosowań), jak szybko będzie później przeszukiwać bazę danych, gdy będzie ona pełna skrótów.
Camilo Martin,
3
Jeśli nie użyjesz wystarczająco szerokiego wyniku, otrzymasz losowe kolizje, co będzie złe, ponieważ celem jest wysłanie zapytania do bazy danych, aby dowiedzieć się, czy dana „fraza” jest już znana; kolizje zamieniają się tutaj w fałszywe alarmy. Mając 32 bity, zaczniesz widzieć kolizje, gdy tylko masz około 60000 fraz. Dotyczy to wszystkich funkcji skrótu, kryptograficznych lub nie. Biorąc to pod uwagę, zawsze możesz pobrać dane wyjściowe funkcji skrótu i ​​przyciąć je do dowolnej długości, zgodnie z ograniczeniami wyjaśnionymi powyżej.
Thomas Pornin,
@ThomasPornin Jeśli pójdziemy na skróty, czy nie staniemy ponownie przed problemem kolizji, mam na myśli, że jedynym powodem, dla którego md5 nie ma łatwej kolizji, jest dodatkowa liczba znaków, które ma w porównaniu z CRC32, prawda?
Mohd Abdul Mujib
4

Caveat

Poniższa odpowiedź nie odpowiada na zadane pytanie, ponieważ nie zaleca funkcji skrótu. Pamiętaj: „Funkcja skrótu to dowolna funkcja, której można użyć do odwzorowania danych o dowolnym rozmiarze na wartości o stałym rozmiarze”. (Wikipedia) Poniższa odpowiedź zaleca przekształcenia, które nie gwarantują wyników o stałym rozmiarze.

Jeśli chcesz złagodzić wymóg korzystania z funkcji skrótu , czytaj dalej ...

Oryginalna odpowiedź

Proponuję urlencode () lub base64_encode () z następujących powodów:

  • Nie potrzebujesz kryptografii
  • Chcesz szybkości
  • Potrzebujesz sposobu na identyfikację unikatowych ciągów podczas czyszczenia „zniekształconych” ciągów

Dostosowując kod porównawczy w innym miejscu w tych odpowiedziach, pokazałem, że każdy z nich jest znacznie szybszy niż jakikolwiek algorytm mieszający. W zależności od aplikacji możesz użyć urlencode () lub base64_encode (), aby wyczyścić wszystkie „zniekształcone” ciągi, które chcesz przechowywać.

Anachronista
źródło
Odp .: „Chcesz znaleźć sposób na identyfikację unikatowych ciągów podczas czyszczenia„ zniekształconych ”ciągów znaków”: czy mógłbyś to rozwinąć?
David J.
Trudno sobie przypomnieć, o czym myślałem ponad sześć lat temu ... Mogłem nawiązywać do faktu, że nie ma kolizji z kodem urlencode lub base64_encode, więc wyniki byłyby tak wyjątkowe, jak oryginalne ciągi.
Anachronista
2

Krok pierwszy: Zainstaluj libsodium (lub upewnij się, że używasz PHP 7.2+)

Krok drugi: użyj jednej z następujących czynności:

  1. sodium_crypto_generichash(), czyli BLAKE2b , funkcja skrótu jest bezpieczniejsza niż MD5, ale szybsza niż SHA256. (Link zawiera testy porównawcze itp.)
  2. sodium_crypto_shorthash(), czyli SipHash-2-4 , który jest odpowiedni dla tabel skrótów, ale nie należy na nim polegać pod względem odporności na kolizje.

_shorthashjest około 3x szybszy niż _generichash, ale potrzebujesz klucza i masz małe, ale realistyczne ryzyko kolizji. Dzięki _generichash, prawdopodobnie nie musisz martwić się o kolizje i nie musisz używać klucza (ale i tak możesz chcieć).

Scott Arciszewski
źródło
1
pytanie brzmi „jak szybko to działa”?
Mój 1
1
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)- blake2b oczywiście, ale implementacja blake2b w PHP w USERLAND będzie o wiele wolniejsza niż sha256 zaimplementowana w C dla PHP ... Chciałbym, żeby PHP mogło dodać blake2b do pakietu hash_algos () ..
hanshenrik
Nie sugerowano tutaj czystej implementacji PHP.
Scott Arciszewski
1

Jeśli szukasz szybkiego i unikalnego, polecam xxHash lub coś, co używa wbudowanego polecenia crc32c nowszego procesora, zobacz https://stackoverflow.com/a/11422479/32453 . Łączy tam również z prawdopodobnie jeszcze szybszymi hashami, jeśli nie zależy Ci tak bardzo na możliwości kolizji.

rogerdpack
źródło
1

Adler32 działa najlepiej na moim komputerze. I md5()okazało się szybsze niż crc32().

Max Tsepkov
źródło
3
Jeśli MD5 jest szybszy niż ogólna funkcja CRC32, coś jest bardzo nie tak.
nxasdf
0

Implementacja md5 inside hash jest trochę szybsza niż md5 (). Może to być opcja lub coś innego, spróbuj:

echo '<pre>';

$run = array();

function test($algo)
{
  #static $c = 0;
  #if($c>10) return;
  #$c++;

 $tss = microtime(true);
 for($i=0; $i<100000; $i++){
  $x = hash($algo, "ana are mere");
 }
 $tse = microtime(true);

 $GLOBALS['run'][(string)round($tse-$tss, 5)] = "\nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
 #echo "\n$i nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
}
array_map('test', hash_algos());
ksort($run);
print_r($run);
echo '</pre>';

Możesz zobaczyć na http://www.dozent.net/Tipps-Tricks/PHP/hash-performance

Szczery
źródło
0

CRC32 jest szybszy, ale mniej bezpieczny niż MD5 i SHA1. Nie ma tak dużej różnicy prędkości między MD5 i SHA1.

Sjoerd
źródło
MD5 jest obecnie uważane za niezabezpieczone. Jest o wiele bardziej niebezpieczny niż SHA1. Przeczytaj stronę wiki MD5.
Ahmed