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.
Odpowiedzi:
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.
źródło
Kod użyty do wygenerowania tego to:
źródło
hash_algos()
. Poniższy kod testowania skrótów znajdował się w komentarzach PHP ==> codepad.viper-7.com/5Wdhw6md5
są 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 phpLista rankingowa, w której każda pętla ma to samo do szyfrowania, co wszystkie inne.
I wyjście
źródło
strlen($characters)
powinno byćstrlen($characters) - 1
:)Na stronie xxhash jest porównanie prędkości. Skopiuj, wklejając tutaj:
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.
źródło
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).
źródło
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?
źródło
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.
źródło
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:
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ć.
źródło
Krok pierwszy: Zainstaluj libsodium (lub upewnij się, że używasz PHP 7.2+)
Krok drugi: użyj jednej z następujących czynności:
sodium_crypto_generichash()
, czyli BLAKE2b , funkcja skrótu jest bezpieczniejsza niż MD5, ale szybsza niż SHA256. (Link zawiera testy porównawcze itp.)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._shorthash
jest 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ć).źródło
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 () ..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.
źródło
Adler32 działa najlepiej na moim komputerze. I
md5()
okazało się szybsze niżcrc32()
.źródło
Implementacja md5 inside hash jest trochę szybsza niż md5 (). Może to być opcja lub coś innego, spróbuj:
Możesz zobaczyć na http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
źródło
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.
źródło