md5() in PHP genereaza valori diferite in functie de server

Salutare,

V-ati lovit cumva pana acum de situatia in care trebuie sa comparati doua hash-uri, ambele generate dupa acelasi algoritm, dar fiecare pe cate un server? Se pare ca rezultatul difera si nu reusesc sa-mi dau seama de ce. Am sapat un pic pe Google dupa aceasta problema, dar fara succes.

Vreo idee?

Multumesc.

Imi suna a problema de encoding. Vezi daca raspunsul asta ti se aplica si tie. Ce caractere incerci sa hash-uiesti?
Apoi, scrie-ne aici cel mai mic script posibil cu care poti reproduce problema constant pe cele doua masini. Ideal un var_dump(md5([string-ul tau])) si atat.

Poate că ar trebui să dai mai multe detalii despre ce vrei să “hăşuieşti”. a-z0-9? Sunt implicate diacritice? (Am avut un server cu probleme ce era în japoneză).

Este vorba despre apelarea functiei md5() dupa urmatorul tipar:

md5(strtotime(date('Y-m-d')) . 'hrmanager' . strtotime(date('Y-m-d')));

Deci fara diacritice.

Ai același timezone pe toate serverele? :smiley:

1 Like

Dap, am verificat si acest lucru.

  1. Fa teste cu niste stringuri simple prima oara, un caracter si dupa aceea un text mai lung 10, 30, 50 caractere si vezi daca sunt diferente.
  2. Valideaza cu un tool extern de genul http://onlinemd5.com/ care varianta e cea corecta.
1 Like

Daca aflu varianta corecta nu ma ajuta prea mult, atata timp cat nu stiu prin ce metoda sa fac astfel incat string-ul rezultat sa fie identic, indiferent de server.

Ar fi util sa afli daca e o problema de md5 sau diferenta la stringul folosit la generare.
Exista diferenta intre cele doua sisteme pe care ruleaza php (Windows vs Mac/Linux)?

1 Like

Nu-i logic ca daca ai un unix timestamp acolo, e posibil sa nu rulezi ambele script-uri in aceeasi secunda? Explica-ne ce vrei sa faci cu aia, poate iti putem oferii alta solutie.

@pghoratiu, exista diferenta, este vorba despre Windows vs Linux.

@IonutBajescu, daca ar fi vorba de secunda, nu ar trebui ca hash-ul generat sa fie altul la fiecare refresh? Nu se intampla asa, e acelasi pe durata unei zile.

Asta nu e cel mai clar script posibil cu care poti testa. Fa asa, pe ambele servere:

$string = strtotime(date('Y-m-d')) . 'hrmanager' . strtotime(date('Y-m-d'));
var_dump($string);
var_dump(md5($string));

Si da-ne si noua rezultatele. Sunt aproape sigur ca o sa observi o diferenta inca de la primul var_dump, caz in care md5 nu are de fapt nici o relevanta. Ca o paranteza, mi se pare fantastic ca am ajuns la nspe comment-uri in threadul asta si tu inca nu ne-ai dat rezultatele de pe ambele servere, ca sa putem compara si cu ce iese pe masinile noastre.

@IonutBajescu strtotime intoarce un timestamp, dar avand in vedere ca el ii da o data care nu contine o unitate mai mica decat o zi, nu ar avea de ce sa difere numarul de secunde atata timp cat ruleaza codul in aceeasi zi pe ambele servere, iar ambele au aceeasi data de sistem.

1 Like

Sau si mai bine, fa un fisier cu codul de mai jos, si da-ne rezultatele:

<?php
$date = date('Y-m-d');
$time = strtotime($date);
$string = $time . 'hrmanager' . $time;
$hash = md5($string);

var_dump($date, $time, $string, $hash);

Pe un server care mi-a fost mai la indemana (Linux), la mine rezultatele sunt urmatoarele (valabile astazi, 06.12):

string(10) "2014-12-06"
int(1417824000)
string(29) "1417824000hrmanager1417824000"
string(32) "ff7f8aa41b4bf96790a77050491dc0bc"
1 Like

Ok, avem asa:

Pe masina de lucru, cu Windows:

string(10) "2014-12-06"
int(1417820400)
string(29) "1417820400hrmanager1417820400"
string(32) "5abea4e15d0b0739f61429fedcec5269"

Pe masina de productie, cu Linux:

string(10) "2014-12-06"
int(1417816800)
string(29) "1417816800hrmanager1417816800"
string(32) "e0de77a48a55cbe927689e20af32153b"

Bun, deci cum ziceam, md5() nu are nici o relevanta in problema ta, ci rezultatul strtotime difera. Atunci e vorba de diferente de timezone. Daca dau var_dump pe masina mea (pe timezone UTC) la un date construit cu cele doua timestamp-uri ale tale:

var_dump(date('d.m.Y H:i:s', 1417820400)); // 05.12.2014 23:00:00
var_dump(date('d.m.Y H:i:s', 1417816800)); // 05.12.2014 22:00:00

Deci o diferenta de una, respectiv doua ore de la rezultatul la care te-ai astepta (06.12.2014 00:00:00).

Asadar, pe ambele servere ruleaza acum asta, sunt aproape sigur ca vei avea doua rezultate diferite:

var_dump(date_default_timezone_get());
1 Like

In concluzie, cand lucrezi cu date pe masini diferite, trebuie sa te asiguri ca folosesti acelasi timezone pe ambele. Eu de obicei setez timezone-ul per proiect cu date_default_timezone_set(), dar daca vrei sa garantezi doar ca functioneaza bucata ta de cod la fel pe ambele masini, incearca varianta asta:

<?php    
$date = date('Y-m-d');
$datetime = new DateTime($date, new DateTimeZone('Europe/Bucharest'));
$time = $datetime->getTimestamp();    
$string = $time . 'hrmanager' . $time;
$hash = md5($string);

var_dump($date, $time, $string, $hash);
2 Likes

Mersi. S-a rezolvat!

1 Like

Păi nu ne spui și cum ? :wink:

1 Like

@iamntz intreaba pentru ca el te-a intrebat clar daca masinile sunt pe acelasi timezone, iar tu ai spus ca:

:smile:

2 Likes

:smiley:

Pai nu verificasem de fapt timezone-ul, ci doar sa fie aceeasi data pe ambele servere.

Ca timezone, aveam Europe/Berlin pe Windows si Europe/Bucharest pe server.

2 Likes