Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Podobieństwo ciągów a md5
Forum PHP.pl > Forum > Przedszkole
Mackos
Mam dość trywialne pytanie.
Sprawa wygląda tak, że z dwóch źródeł (bazy i url) zaciągam kod html tej samej strony.
I teraz chcę porównać za pomocą ciągu znaków czy na pewno wygląd strony się nie zmienił, jednak może być sytuacja że zaciągnięty kod może delikatnie się różnić od tego w bazie, bo np. jak zaciągnę stronę z (wyobraźmy sobie) zaciągniętą sesją gdzie pisze "Witaj Maciej" to przez algorytm powinno to być uznane za tą samą stronę co z tekstem "Zaloguj się", jednak jeśli zostanie dodany nowy artykuł na stronie to algorytm powinien wykryć "nową wersję" strony.
I chciałem tutaj użyć funkcję Levenshteina levenshtein jednak z tego co wyczytałem w manualu może być max 255 znaków.
W związku z czym zastanawiam się czy zakodowanie obu wersji do md5 a następnie porównanie ich zda egzamin? Czy md5 może wykazać różnice lub podobieństwo? Jakie może być prawdopodobieństwo kolizji?


Edit: pomyłka chodziło mi o md5 nie base64

Dobra widzę że md5 nie był najlepszym pomysłem.
Jak by nie było niesamowicie wszystko muli przy tak długich ciągach znaków. Ma ktoś rozwiązanie jak to porównać żeby nie wywalało mi memory exceed?
timon27
jeśli w ciągu zmieni się choćby jedna literka to dowolny hash zmienia się zupełnie (nie ma żadnego związku z poprzednim). Gdyby było inaczej świadczyłoby to o jego słabości.

Porównanie tak wielkich ciągów nie jest dobrym pomysłem.
Powiedz co chcesz zrboić:
a ) sprowdzić czy strona się w ogóle zmieniła - sprawdź równość hashy
b ) sprawdzić czy się zmieniło coś konkretnego - wyciągnij tylko konkretną rzecz do porównania (np. interesuje cie stan produktu to wyciągnij tylko tę informację)

Przede wszystkim ogranicz to co porównujesz. Na pewno nie chcesz porównywać całej strony (nie interesują cie inne reklamy, czy zmienne informacje w stopce) wyciągnij tylko interesującego cię diva.
Mackos
Przygotowuję całkiem rzeźnię dla serwera.
W skrócie strony będą dodawane przez użytkowników, raz na czas powiedzmy 4-8 godzin) muszę sprawdzać czy nic się nie zmieniło np. nie dodano żadnego artykułu. W związku z czym nie mam możliwości napisania ogólnego regexa dla strony.
Jednak to co w miarę poprawiło sprawę to usunięcie wszystkich białych znaków z kodu oraz parsowanie tylko przedziału znaczników <body> ...
Zastanawiam się czy można to jeszcze jakoś udoskonalić, bo nadal czas wykonania 28 - 60+ sekund...

W sumie możnaby usunąć jeszcze wszystkie tagi html i spacje questionmark.gif Zda egzamin?
timon27
"czy nie dodano nowego artykułu"
Nie przechowuj całęj treści strony tylko tytuł najnowszego artykułu.

Jak obserwujesz inne elementy to dodaj tylko te elementy. A nie całą stronę.
Mackos
Strony będą dodawane przez użytkowników = skąd mam niby wyciągnąć treść artykułu jak z góry kod html każdej strony będzie inny i w żaden sposób nie narzucony przeze mnie? wink.gif
Już ogarnąłem po prostu usuwając spacje, białe znaki i tagi html jestem w stanie wyciągnąć ciąg znaków który jest jednoznaczny dla każdej aktualizacji strony, a zmiana jest zauważalna przez system.
Tylko niestety przy jednych stronach to działa tak, że podobieństwo stron gdzie różnica to (+/-) jeden artykuł wynosi aż 91% :/
gitbejbe
ja pitole, czuje że kombinujesz jak koń pod górkę. Jednak ludzka wyobraźnia nie zna granic

Cytat
W skrócie strony będą dodawane przez użytkowników, raz na czas powiedzmy 4-8 godzin) muszę sprawdzać czy nic się nie zmieniło np. nie dodano żadnego artykułu.


Ja tutaj nie widzę innego rozwiązania jak tylko dla każdej akcji użytkownika zrobić jakiś raport/historie zmian np do bazy. Nie ważne kto co zmieni na stronie, jeśli zapisze dany układ to leci raport do bazy dla tego użytkownika i koniec - a później możesz sobie robić z tym co tylko chcesz. Skąd Ty wymyśliłeś jakieś porównywanie md5 źródła strony ?!
viking
Dodaj jakiś trigger IF NEW.cos <> OLD.cos to co tam sobie chcesz. Chyba że bardziej kombinujesz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.