Perl正则表达式匹配MD5哈希值?

问题描述:

最近在PHP中编程,我以为我有一个正常工作的Perl正则表达式,但是当我检查它对我想要的,它不起作用。Perl正则表达式匹配MD5哈希值?

什么是正确的表达式来检查是否有某物是MD5(32位十六进制的a-z和0-9)。

目前,我有/^[a-z0-9]{32}$/i

+25

由于没有十六进制数时上升到z? – 2010-02-18 02:01:16

MD5:

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

SHA-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.

+0

你刚刚为我节省了很多痛苦的谷歌搜索 – 2010-05-27 00:20:09

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

应工作好一点,因为MD5哈希值通常表示为十六进制数。

@OP,您可能想要使用/[a-f0-9]{32,40}/,这可以检查长度大于32,如从sha1生成的那些。

也有POSIX字符类xdigit(见perlreref):

/^[[:xdigit:]]{32}$/ 

好了,要考虑的重要一点是,$可以匹配\n。因此:

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

哎呀!

正确的模式,因此,是:所推荐的PHP Ctype Functions

/^[[:xdigit:]]{32}\z/ 

更方便,更比正则表达式快:

function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); }