Confrontare gli hash con == o ===?
Prima di rispondere alla domanda, cerchiamo di capire la differenza nell’utilizzare ==
o ===
come operatori di confronto.
$a == $b
TRUE se $a è uguale a $b dopo la manipolazione dei tipi.$a === $b
TRUE se $a è uguale a $b, e sono dello stesso tipo.
Se usiamo ==
per comparare gli hash, abbiamo questa sorpresa:
var_dump(md5('240610708') == md5('QNKCDZO')); // true
Se invece usiamo ===
, non c’è alcuna sorpresa:
var_dump(md5('240610708') === md5('QNKCDZO')); // false
Qui non siamo davanti a nessun hash collision bensì al fatto che la comparazione con ==
è più “approssimativa” rispetto a quella con ===
.
var_dump(md5('240610708')); // 0e462097431906509019562988736854
var_dump(md5('QNKCDZO')); // 0e830400451993494058024219903391
Se confrontiamo gli hash con ===
giustamente scopriamo che le 2 stringhe sono diverse, ma se usiamo ==
possiamo vedere come i due valori sono uguali perchè il primo hash corrisponde al numero 0*10462097431906509019562988736854 cioè 0, così come il secondo 0*10830400451993494058024219903391 (quindi 0 è uguale a 0).
Morale della favola? per comparare gli hash è vivamente consigliato utilizzare ===
oppure la funzione hash_equals
.