Регулярные выражения Perl для соответствия хэшу MD5?


Недавно, программируя на PHP, я думал, что у меня есть работающее регулярное выражение Perl, но когда я сверил его с тем, что хотел, оно не сработало.

Какое правильное выражение для проверки, есть ли что-то в MD5 (32-значная шестнадцатеричная цифра a-z и 0-9).

В настоящее время у меня есть /^[a-z0-9]{32}$/i

Author: Alix Axel, 2010-02-18

6 answers

МД5:

/^[0-9a-f]{32}$/i

ША-1:

/^[0-9a-f]{40}$/i

MD5 или SHA-1:

/^[0-9a-f]{32}(?:[0-9a-f]{8})?$/i

Кроме того, большинство хэшей всегда представлены в шестнадцатеричном виде в нижнем регистре, поэтому вы можете рассмотреть возможность удаления модификатора i.


Кстати, шестнадцатеричный означает основание 16:

0  1  2  3  4  5  6  7  8  9  A   B   C   D   E   F  = base 16
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 = base 10

Таким образом, как вы можете видеть, оно изменяется только от 0 до F, так же, как десятичное число (или основание 10) изменяется только от 0 до 9.

 33
Author: Alix Axel, 2010-02-19 02:18:49
/^[a-f0-9]{32}$/i

Должно работать немного лучше, так как хэши MD5 обычно выражаются шестнадцатеричными числами.

 13
Author: Mikael S, 2010-02-18 01:57:25

Существует также класс символов POSIX xdigit (см. perlreref):

/^[[:xdigit:]]{32}$/
 9
Author: toolic, 2010-02-18 02:18:50

Что ж, важным моментом для рассмотрения является тот факт, что $ может соответствовать \n. Следовательно:

E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/"
OK

Упс!

Следовательно, правильный шаблон таков:

/^[[:xdigit:]]{32}\z/
 5
Author: Sinan Ünür, 2010-02-18 02:24:19

Даже проще и быстрее, чем регулярное выражение, как рекомендовано PHP Функции Ctype :

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); }
 0
Author: llange, 2014-02-12 16:48:31

@OP, возможно, вы захотите использовать /[a-f0-9]{32,40}/, это может проверить длину, превышающую 32, например, сгенерированную из sha1.

 -1
Author: ghostdog74, 2010-02-18 02:06:57