折腾:
【已解决】java中md5值的长度是16位(字节)还是32位(字节)及两者之间关系
期间,问题转化为:
用Python代码实现
java中的先用md5.digest生成16位,再用0-9,a-z(或A-Z)去合并计算出32位
的逻辑
python implement java md5.digest 16 to 32
101 – Python Vs Java Md5 Hexdigest – pad.yohdah.com
//# the PYTHON way import sys from hashlib import md5 for arg in sys.argv[1:]: print md5(arg).hexdigest() //# The Java way ... import java.security.MessageDigest; import java.math.BigInteger; class MD5 { public String message; public MD5( String message ) { this.message = message; } public String hexdigest() throws Exception { String hd; MessageDigest md5 = MessageDigest.getInstance( "MD5" ); md5.update( this.message.getBytes() ); BigInteger hash = new BigInteger( 1, md5.digest() ); hd = hash.toString(16); // BigInteger strips leading 0's while ( hd.length() < 32 ) { hd = "0" + hd; } // pad with leading 0's return hd; } public static void main( String[] args ) throws Exception { for ( String message: args ) { System.out.println( new MD5( message ).hexdigest() ); } } }
-》这里是用java实现了16位,然后剩下都是填充0
-》不是我要的
python equivalent of java md5.digest 16
好像是我们要的?
不过突然想起来:
难道python的32位字符,本身已经是用同样逻辑生成的字符了?
-》如果是,那就不用去写代码了,否则生成的结果还是一样的
-》还是解决不了问题啊
-》不过还是继续去试试再说
突然再注意到:
中的:
int_hex = int(s, 16)
其实就是前面
【已解决】java中md5值的长度是16位(字节)还是32位(字节)及两者之间关系
中的:
hexDigits[byte0 >>> 4 & 0xf]
-》所以其实就是一样的,无需再去写Python了。
不过也还是去调试看看
md5Digest = md5Result.digest() print("md5Digest=%s" % md5Digest) # print("len(md5Digest)=%s" % len(md5Digest)) md5Hexdigest = md5Result.hexdigest() print("md5Hexdigest=%s" % md5Hexdigest) print("len(md5Hexdigest)=%s" % len(md5Hexdigest))
输出:
md5Digest=b'\xde\xfc;#\x11g\xe1i2\xea\x92=an-@' len(md5Digest)=16 md5Hexdigest=defc3b231167e16932ea923d616e2d40 len(md5Hexdigest)=32
写代码试试
先搜:
python md5 digest vs hexdigest
【总结】
此处,确认了,java中之前碰到的:
{ char[] arrayOfChar = new char[16]; char[] tmp6_5 = arrayOfChar; tmp6_5[0] = 48; char[] tmp12_6 = tmp6_5; tmp12_6[1] = 49; char[] tmp18_12 = tmp12_6; tmp18_12[2] = 50; char[] tmp24_18 = tmp18_12; tmp24_18[3] = 51; char[] tmp30_24 = tmp24_18; tmp30_24[4] = 52; char[] tmp36_30 = tmp30_24; tmp36_30[5] = 53; char[] tmp42_36 = tmp36_30; tmp42_36[6] = 54; char[] tmp49_42 = tmp42_36; tmp49_42[7] = 55; char[] tmp56_49 = tmp49_42; tmp56_49[8] = 56; char[] tmp63_56 = tmp56_49; tmp63_56[9] = 57; char[] tmp70_63 = tmp63_56; tmp70_63[10] = 97; char[] tmp77_70 = tmp70_63; tmp77_70[11] = 98; char[] tmp84_77 = tmp77_70; tmp84_77[12] = 99; char[] tmp91_84 = tmp84_77; tmp91_84[13] = 100; char[] tmp98_91 = tmp91_84; tmp98_91[14] = 101; char[] tmp105_98 = tmp98_91; tmp105_98[15] = 102; tmp105_98; try { paramString = paramString.getBytes(); Object localObject = MessageDigest.getInstance("MD5"); ((MessageDigest)localObject).update(paramString); paramString = ((MessageDigest)localObject).digest(); int i = paramString.length; localObject = new char[i * 2]; int j = 0; int k = 0; while (j < i) { int m = paramString[j]; int n = k + 1; localObject[k] = ((char)arrayOfChar[(m >> 4 & 0xF)]); k = n + 1; localObject[n] = ((char)arrayOfChar[(m & 0xF)]); j++; } paramString = new String((char[])localObject); return paramString; } catch (Exception paramString) {} return null; }
md5的计算逻辑,和此处Python的md5计算逻辑:
md5Hexdigest = md5Result.hexdigest() print("md5Hexdigest=%s" % md5Hexdigest)
是一致的,都是:
内部如果调用.digest(),则返回的都是16字节的,二进制byte数据
然后用对应的算法,去处理生成32字节的字符串。
对应的算法,详见:
【已解决】java中md5值的长度是16位(字节)还是32位(字节)及两者之间关系
举例,python的:
md5Digest = md5Result.digest() print("md5Digest=%s" % md5Digest) # print("len(md5Digest)=%s" % len(md5Digest)) md5Hexdigest = md5Result.hexdigest() print("md5Hexdigest=%s" % md5Hexdigest) print("len(md5Hexdigest)=%s" % len(md5Hexdigest))
输出的是:
md5Digest=b'\xde\xfc;#\x11g\xe1i2\xea\x92=an-@' len(md5Digest)=16 md5Hexdigest=defc3b231167e16932ea923d616e2d40 len(md5Hexdigest)=32
而想要把32字节的str转换为16字节的byte,可以参考:
的:
import hashlib def get_md5(s): m = hashlib.md5(s) return m.hexdigest() def convert_md5(origin): result = [] s = "" for i in range(len(origin)): s += origin[i] if i %2 != 0 : int_hex = int(s, 16) result.append(int_hex) s = "" return result if __name__=="__main__": sum = get_md5("hello world") print sum print len(sum) cv_sum = convert_md5(sum) print cv_sum print len(cv_sum) # 5eb63bbbe01eeed093cb22bb8f5acdc3 # 32 # [94, 182, 59, 187, 224, 30, 238, 208, 147, 203, 34, 187, 143, 90, 205, 195] # 16
即可。
转载请注明:在路上 » 【无需解决】用Python实现Java中的32位(字节)的md5的计算逻辑即先md5.digest生成16位再合并处理成32位