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.

Most recent

Most voted

Leave a Reply

Your email address will not be published. Required fields are marked *