web-dev-qa-db-ja.com

なぜmd5( '240610708')がmd5( 'QNKCDZO')と等しいのですか?

var_dump(md5('240610708') == md5('QNKCDZO'));

出力:

bool(true)

例:http://3v4l.org/2vrMi

24
Farid Movsumov

md5('240610708')の結果は_0e462097431906509019562988736854_です。

md5('QNKCDZO')の結果は_0e830400451993494058024219903391_です。

それらは両方ともfloat数値フォーマット文字列数値文字列)であり、 PHPで_==_を使用します。数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます。

_0_と比較すると、両方の文字列が_==_に変換されます。これらを文字列として比較する場合は、_===_(strict比較を使用してください)代わりに。

参照: PHPは2つの異なる文字列を同じであると表現しています

40
xdazz

タイプ依存の比較演算子===を使用する必要があります。

ハッシュはそれぞれ0e462097431906509019562988736854および0e830400451993494058024219903391に評価されます。 ==を使用すると、e(科学的表記)により、それぞれが数値表現に変換されるため、それぞれが0になります。 0 == 0はtrueです。

一方、これは:

md5('240610708') === md5('QNKCDZO')

stringの値が異なるため、falseを返します。 ===は、型依存の比較を強制します。

11
elixenide