nlothik (nlothik) wrote,
nlothik
nlothik

Category:

PHP порадовал

Нашёл старенький пример, который, оказывается, до сих пор работает.

var_dump(md5(‘240610708’) == md5(‘QNKCDZO’));

Выдаёт bool(true).

То-есть, MD5 хеши для строк ‘240610708’ и ‘QNKCDZO’ являются одинаковыми (с точки зрения PHP).

С нормальной точки зрения хеши неодинаковы. Первый 0e462097431906509019562988736854, второй — 0e830400451993494058024219903391.

Но. Оператор сравнения == в PHP может на ходу преобразовать тип данных (type mangling). Эти строки оно переделывает в цифры в экспоненциальной записи. Всё, что до ‘e’ — мантисса, всё, что потом — порядок. А так как мантисса у нас 0, её можно умножать хоть на чёрта лысого, она всё равно останется нулём. 0 == 0, естественно, возвращается true.

Вот, что случается, когда кто-то придумывает свой язык программирования с синтаксисом Си, но что-то записанное этим синтаксисом, работает не как в Си.

В PHP данная ошибка программиста (программиста ли?) лечится использованием специального оператора сравнения === вместо ==, т.е. строгим сравниванием вместо обычного, без преобразования типов.

Вот именно поэтому не следует учиться программированию на языках со слабой и динамической типизацией данных. На питонах, перлах и php можно, например, сравнить “1” и 5. А Джава незамедлительно пошлёт погромиста нахер: не сравнивай божий дар с яичницей. Плюс на Джаве то, что выглядит так как на Си, работает так же. Что, на мой взгляд, архиверно.

Mirrored from Лабораторный Журнал №6.

Tags: uncategorized
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 10 comments