- 1
- 2
- 3
- 4
- 5
- 6
- 7
function advancedMD5($parol) {
$zashita = 50;
for( $i = 0; $i < $zashita; $i++ ) {
$parol = md5($parol);
}
return $parol;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+167
function advancedMD5($parol) {
$zashita = 50;
for( $i = 0; $i < $zashita; $i++ ) {
$parol = md5($parol);
}
return $parol;
}
Неповторимый инновационный алгоритм шифрования паролей...
с другой стороны, повторять md5 не имеет большого смысла - хэш уже давно сломан.
Он взломан только по основному назначению, т.к. научились создавать вполне осмысленные файлы с одинаковыми хешами. А необратимость, емнип, не пострадала.
А для хеширования паролей любая одиночная хеш-функция не имеет большого смысла, т.к. вычисляется слишком быстро. Ради этого и мутили все эти PBKDF2 да bcrypt'ы с scrypt'ами.
2) Если об этом написано в доке или доступны исходники - хакер будет думать иначе.
Не айс ;)
* т.к. не тупые не будут менять пароль на 123456
Кстати, в php есть уникальные грабли: если потом контрольную сумму, хранящуюся в string, сравнивать через == вместо ===, то столкновений будет ещё больше!
http://ideone.com/qTdAO2
В PHP 5.4 действительно пофиксили. Но во всё ещё популярном 5.3 всё плохо.
Это ж плавпитух, от него в разных местах страдают многие (и не только скриптовые) языки, например тот же js.
Но как можно в динамически типизированном языке быть 100% уверенным что сравниваешь строки???
Никто ж не пишет перед каждой операцией конверсию переменных в нужный тип — тогда весь смысл языка теряется.
Вот жс строку с интом тоже говняет:
'123456789012345678901234567890' == 123456789012345678900000000000 //true
В перле тоже направление каста однозначно и определяется оператором.
1. Отменить ==, а вместо него использовать ===. Всегда.
2. Если нужно сравнивать значения (предположительно) разных типов, то использовать явное преобразование:
intval('0e12') === intval('0e13')
floatval('0e12') === floatval('0e13')
strval('0e12') === strval('0e13')
и так далее.
3. Наконец, и от безумных intval/strval отказаться в пользу более явных. Вместо strval использовать что-то типа sprintf, где можно указать желаемый формат. Вместо intval — функции округления, как предлагает Борманд.
Может лучше выпилить ===, а == пусть работает как ===? Зачем лишнюю палку то писать?
А вообще, с такими переделками, проще послать пыху нахуй и уйти на какой-нибудь питон.
Чёрт! В 5.6 та же питушня, и даже в экспериментальном 5.7/7.0 тоже.
В пёрле все же лучше сделали - отдельные операторы для сравнения чисел и строк. Всегда понятно, что именно произойдет.
И в PHP 5.6 то же самое. Поэтому только ===, только хардкор.
P.S. Предлагаю запретить "преобразование типов" и вообще выпилить нахуй это бессмысленное и ни о чем не говорящее понятие.
А сравнения?
Сравнивать строковой вид объектов, сравнить с глубоким/неглубоким обходом, просто сравнивать ссылки/указатели, сравнивать плавающие с эпсилоном, без? Сколько таких штук =, ==, ===, ====, ===== надо ввести в язык?
Причем это я молчу о сравнениях с преобразованиями типов.
А ну это именно то о чем так долго говорили Тарас и большевики.
Лично я ненавижу сишкоблядские касты, о чем говорил неоднократно.
Во-первых это невозможно быстро нагуглить, если не знаешь слова cast, а когда неявно преобразуется, то и вовсе без прочтения половины доки/стандарта языка не поймешь как же оно работает.
Гораздо понятнее было бы типа аналог конструктора int(2.0), чем (int) 2.0, ну или функция toInt(2.0).
PS> А можно поподробнее про баг в мускуле, помню тред тут проскакивал, но детали совершенно выветрились из моей памяти.
Ведь мы думаем об округлении, взятии целой части и.т.п. а не о неведомом приведении флота к инту...
Придётся тогда тащить вывод типов в каждый язык с floor и его товарищами или плодить неведомые конструкции.
Хочу я, например, округлить число и сохранить его в переменную.
Сейчас: double x = round(3.5); int x = round(3.5);
С крайне полезными floor/ceil с очевиднейшей семантикой без вывода типов:
double x = round<double>(3.5); int x = round<int>(3.5);
Или придётся оставить касты, но привинтить много новых интересных типов:
P.S. Ещё шаг - и автоматическое доказательство корректности программ придёт к нам.
63%, что существует такое x, что x = f(x).
Une parole encore.
Paroles, paroles, paroles
Écoute-moi.
Paroles, paroles, paroles
Je t'en prie.
Paroles, paroles, paroles
Je te jure.
Paroles, paroles, paroles, paroles, paroles
Encore des paroles que tu sèmes au vent
Voilà mon destin te parler....