Generator haszy tablic
Generuj hash (MD5, SHA-1, SHA-256) z tablicy PHP lub danych JSON. Przydatne do cache key, porównywania struktur danych i fingerprintów. Bezpłatnie.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
/**
* Wygenerowano w generatorze pomocniczych tablic hashów (webp.pl)
* Algorytm: SHA256 (długość 12)
* Identyfikatory: 12
*/
export const HASHES = {
"api-cache": "110ee900bbd9",
"app-shell": "b4ed9632452f",
"index.html": "0eb547304658",
"logo-192.png": "43fde4e4c600",
"logo-512.png": "6dd0787ca5d1",
"main.js": "58417e0f781b",
"notifications": "8bb6922758ad",
"offline.html": "8bfbab894e0a",
"settings": "cde0fb0dec14",
"styles.css": "380b7b38760d",
"user-profile": "2617516f2ce3",
"vendor.js": "0000e2772441"
};
export const hashForId = (id) => HASHES[id] || '';
export default HASHES;
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator haszy tablic PHP – fingerprint struktury danych
Porównywanie lub cache'owanie złożonych tablic PHP wymaga tworzenia deterministycznych kluczy. Narzędzie generuje hash z tablicy PHP (serialize + hash) lub JSON, co pozwala na szybkie porównywanie struktur bez pełnej iteracji.
Metody haszowania tablic w PHP
serialize() + hash(): serialize($arr) daje deterministyczny string reprezentacji tablicy. md5(serialize($arr)): szybki hash, 32 hex. sha1(serialize($arr)): 40 hex. hash("sha256", serialize($arr)): 64 hex. json_encode() + hash(): alternatywna serializacja (nie obsługuje zasobów/obiektów).
serialize() vs json_encode()
serialize(): natywne PHP, obsługuje obiekty (klasy), zasoby (częściowo), typy ścisłe. json_encode(): JSON-kompatybilny, przenośny (inne języki), wolniejszy dla zagnieżdżonych struktur. Dla prostych tablic asocjacyjnych: json_encode() jest porównywalny. Dla obiektów z metodami: serialize() jedyna opcja.
Kolejność kluczy a deterministyczność
Problem: ["b"=>2,"a"=>1] vs ["a"=>1,"b"=>2] mają różne serialize() ale logicznie identyczne. Rozwiązanie: ksort() rekurencyjny przed serializacją. Funkcja array_hash_sorted: function array_hash($a){ksort($a);foreach($a as &$v)if(is_array($v))$v=array_hash($v);return md5(serialize($a));}.
Zastosowania w aplikacjach
Cache key z parametrów zapytania: $key="sql:".array_hash($params). Wykrywanie zmian konfiguracji: porównaj hash pliku config z poprzednim. Etag HTTP: hash tablicy z danymi = wartość nagłówka ETag (cache validation). Duplikaty: porównaj hashe zamiast deep-equal.
Jak powstaje skrót z tablicy — od kluczy do łańcucha hex
Funkcja haszująca nie przyjmuje tablicy — przyjmuje ciąg bajtów. Dlatego generator najpierw zamienia całą strukturę na jeden deterministyczny łańcuch, a dopiero potem liczy z niego skrót. Kolejność jest stała i ma znaczenie: normalizacja kluczy, serializacja, obliczenie skrótu, zapis w postaci szesnastkowej. Każdy z tych kroków musi być powtórzony identycznie po obu stronach porównania, inaczej wynik będzie za każdym razem inny.
Normalizacja to rekurencyjne ksort(): klucze każdej tablicy — także zagnieżdżonej — są porządkowane alfabetycznie przed serializacją. Bez tego dwie logicznie identyczne tablice, różniące się wyłącznie kolejnością wpisania kluczy, dałyby różne łańcuchy, a więc różne skróty. Serializacja to serialize() (reprezentacja z typami PHP, z licznikiem elementów i długościami napisów) albo json_encode() (zapis JSON) — zależnie od tego, co wybierzesz w narzędziu.
Skrót liczony jest z całego łańcucha wejściowego, bajt po bajcie. Każdy znak hex to 4 bity, więc MD5 zwraca 32 znaki (128 bitów), SHA-1 40 znaków (160 bitów), a SHA-256 64 znaki (256 bitów). Zmiana jednego znaku w łańcuchu wejściowym zmienia praktycznie cały skrót, natomiast dwa identyczne łańcuchy dają zawsze ten sam wynik. Długość skrótu nie zależy od rozmiaru tablicy — zależy wyłącznie od wybranego algorytmu.
Przykład krok po kroku: tablica parametrów zapytania
- Wejście: tablica $params z trzema kluczami w kolejności takiej, jak przyszły z żądania: sort = "asc", page = 3, limit = 20.
- Normalizacja: rekurencyjny ksort() ustawia klucze alfabetycznie — limit, page, sort.
- Serializacja: serialize() zwraca łańcuch a:3:{s:5:"limit";i:20;s:4:"page";i:3;s:4:"sort";s:3:"asc";} o długości 57 znaków (5 + 16 + 14 + 21 + 1).
- Skrót: hash("sha256", ten łańcuch) daje 64 znaki hex, czyli 256 bitów.
- Kontrola deterministyczności: ta sama tablica wpisana w innej kolejności po ksort() daje ten sam łańcuch 57 znaków, więc identyczny skrót — porównanie zwraca równość.
- Zmiana danych: podmiana wartości page z 3 na 4 zmienia jeden znak w łańcuchu wejściowym (i:3; staje się i:4;), więc nowy skrót jest inny. Zapisujesz go jako klucz cache z prefiksem, np. sql: plus skrót, i nie musisz wstawiać całej tablicy do klucza.
Warianty haszowania tablic — szybka ściągawka
| Wariant | Wynik | Kiedy używać |
|---|---|---|
| md5(serialize($a)) | 32 znaki hex (128 bitów) | szybkie klucze cache i wykrywanie zmian |
| sha1(serialize($a)) | 40 znaków hex (160 bitów) | gdy potrzebny dłuższy skrót niż MD5 przy tej samej prostocie |
| hash("sha256", serialize($a)) | 64 znaki hex (256 bitów) | fingerprint struktury, porównania między systemami |
| serialize($a) | łańcuch z typami PHP | obiekty klas, typy ścisłe (liczba vs napis) |
| json_encode($a) | tekst JSON | przenośność między językami, proste tablice i skalary |
| serialize() bez ksort() | różne wyniki dla tej samej zawartości | porównania są zawodne przy innej kolejności kluczy |
| json_encode() + ksort() | jeden wynik, ale bez typów obiektowych | dane z API, które mają krążyć dalej jako JSON |
Praktyczne wskazówki użycia
- Ustal algorytm raz i wszędzie — jeśli klucz cache powstaje w jednym miejscu aplikacji, a jest sprawdzany w innym, oba muszą używać tego samego algorytmu i tej samej serializacji. Dobrze jest dopisać nazwę algorytmu do wartości klucza, żeby późniejsza zmiana nie unieważniła danych po cichu.
- Sortuj klucze po obu stronach porównania — ksort() musi zadziałać zarówno przy tworzeniu skrótu, jak i przy jego sprawdzaniu. Sortowanie tylko po jednej stronie to najczęstsza przyczyna fałszywego „dane się zmieniły”.
- Dobierz serializację do rodzaju danych — obiekty klas i typy ścisłe wymagają serialize(); dane, które mają krążyć między językami lub trafić do API, lepiej zakodować jako JSON.
- Nie traktuj skrótu jak kopii danych — przechowuj oryginalną tablicę osobno. Skrót służy do porównań i budowy kluczy, nie do odtworzenia zawartości.
- Przetestuj na dwóch kolejnościach kluczy — przed wdrożeniem policz skrót dla tablicy i dla jej wariantu z odwróconą kolejnością kluczy. Wynik musi być identyczny, inaczej normalizacja nie działa.
Czego nie uwzględnia ten sposób haszowania
- Nie odtworzysz danych ze skrótu — hash jest jednokierunkowy; z 32, 40 czy 64 znaków nie odczytasz zawartości tablicy ani jej struktury.
- serialize() zależy od konfiguracji PHP — reprezentacja liczb zmiennoprzecinkowych może się różnić między wersjami i ustawieniami (serialize_precision), więc ten sam kod na innym serwerze może dać inny łańcuch, a więc inny skrót.
- json_encode() zatraca część informacji — nie obsługuje zasobów ani obiektów z metodami, a po ponownym dekodowaniu typy liczb i napisów mogą wyglądać inaczej niż w oryginale.
- Sortowanie kluczy może zatrzeć istotną kolejność — dla list uporządkowanych (np. kolejka elementów) ksort() zmienia sens danych; takich struktur nie normalizuje się tą samą metodą co tablice asocjacyjne.
Najczęstsze pytania
Czy MD5 jest bezpieczny do haszowania tablic?
Dla celów cache i porównywania danych – tak. MD5 jest wystarczający gdy nie chodzi o bezpieczeństwo kryptograficzne. Dla haseł: NIGDY – używaj password_hash() z bcrypt/argon2. MD5 jest łatwy do odwrócenia dla znanych danych (rainbow tables).
Jak porównać dwie tablice PHP bez kolejności kluczy?
Prosta równość: $a == $b (PHP sprawdza wartości, nie kolejność kluczy dla asocjacyjnych). Głęboka równość: funkcja rekurencyjna ksort + serialize. Biblioteka: symfony/property-access lub twig/twig. PHP 8.1+: array_is_list() dla list (numerycznych).
Jak generować ETag HTTP z danych?
$data = fetchFromDB(); $etag = array_hash($data). header("ETag: \"$etag\""); if ($_SERVER["HTTP_IF_NONE_MATCH"] === $etag) { http_response_code(304); exit; }. ETag pozwala przeglądniom cachować zasoby i sprawdzać czy się zmieniły bez pobierania całości.
Co to jest cache key i jak go konstruować?
Cache key: unikalny identyfikator dla cachowalnej wartości. Konstruowanie: "prefix:version:hash_params". Przykład: "user:v2:".md5(serialize($queryParams)). Redis: SET $key $value EX 3600. Memcached: $mc->set($key, $value, 3600). Narzędzie generuje hash gotowy do użycia jako klucz.
Czy serialize() jest bezpieczne do deserializacji?
unserialize() z niezaufanych danych = krytyczna luka bezpieczeństwa (PHP object injection, RCE). Nigdy nie deserializuj danych od użytkownika! Dla bezpiecznej serializacji: json_encode/json_decode (tylko dane, nie obiekty PHP). PHP 7+: unserialize($data, ["allowed_classes" => false]) ogranicza typy.
Jak zrobić hash tablicy w PHP?
Najprościej połączyć serialize() z funkcją hash: hash("sha256", serialize($tablica)). Jeśli kolejność kluczy nie jest z góry ustalona, przed serializacją posortuj klucze rekurencyjnie funkcją ksort(), inaczej ten sam zestaw danych da różne skróty.
Dlaczego hash tablicy zmienia się przy tych samych danych?
Najczęstsza przyczyna to inna kolejność kluczy — serialize() zapisuje je w takiej kolejności, w jakiej występują w tablicy. Drugą przyczyną jest inny algorytm lub inna metoda serializacji (serialize kontra json_encode) po jednej ze stron porównania.
Ile znaków ma hash tablicy?
Zależy wyłącznie od algorytmu: MD5 daje 32 znaki hex, SHA-1 daje 40, a SHA-256 daje 64. Rozmiar tablicy nie ma znaczenia, bo skrót liczy się z całego łańcucha wejściowego, niezależnie od liczby elementów.
Czy hash tablicy nadaje się na klucz cache?
Tak, to jedno z typowych zastosowań. Skrót jest krótki i deterministyczny, więc dobrze działa jako klucz w Redisie czy Memcached. Pamiętaj tylko, żeby przy odczycie użyć dokładnie tego samego algorytmu i tej samej normalizacji co przy zapisie.
Jak porównać dwie tablice bez iteracji?
Policz skrót obu tablic i porównaj łańcuchy hex. Przy dużych strukturach to szybsze niż rekurencyjne porównywanie elementów, ale wymaga identycznej normalizacji po obu stronach — w przeciwnym razie różnica w kolejności kluczy da fałszywy wynik.
Powiązane narzedzia: generator testowego JSON API, walidator JSON i formater payloadow API.