首页 > 程序人生 > 用shell脚本求给定字符串的64位签名(MD5)

用shell脚本求给定字符串的64位签名(MD5)

最近写一个东东用到的,分享一下:
1. 十进制版本

1
2
3
4
5
6
7
function get_dec_hash64()
{
    local url=$1
    local m=`echo -n "$url" | md5sum | awk '{print $1}'`
    local h="\x${m:0:2}\x${m:2:2}\x${m:4:2}\x${m:6:2}\x${m:8:2}\x${m:10:2}\x${m:12:2}\x${m:14:2}"
    echo -ne $h | od -An -t u8 |awk '{print $1}'
}

解释一下:
(1)用md5sum求出来的是128位的md5, 一般用的64位md5是截取128位的前64位,进行字节序转换的结果。所以首先用md5sum求128位md5,得到m
(2)取m高64位,并将其转化为echo可以识别的二进制字节流形式,得到h
(3)通过echo把二进制字节流h做为od的输入,od指定输出格式为8位的unsigned,就得到了结果

2. 十六进制版本

1
2
3
4
5
6
7
function get_hex_hash64()
{
	local url=$1
	local m=`echo -n "$url" | md5sum | awk '{print $1}'`
	local h="${m:14:2}${m:12:2}${m:10:2}${m:8:2}${m:6:2}${m:4:2}${m:2:2}${m:0:2}"
	echo -ne "$h" | awk '{print "0x"$1}'
}

如果理解了上面的十进制版本,这个十六进制版本就不难理解了。这里需要说明的一点是,上面的十进制版本,由od内部进行了字节序转换,而在十六进制版本这里最终的结果是直接echo出来的,所以这里要我自行进行字节序转换。区别主要在h。

分类: 程序人生 标签: , ,
  1. 本文目前尚无任何评论.
  1. 2010年4月18日13:09 | #1
您必须在 登录 后才能发布评论.