MD5在Java中生成31个字符的散列 [英] MD5 Generates 31 character hash in Java
问题描述
我正在使用以下代码块来生成MD5哈希值:
I am using following code block to generate MD5 hashes:
public static String encode(String data) throws Exception {
/* Check the validity of data */
if (data == null || data.isEmpty()) {
throw new IllegalArgumentException("Null value provided for "
+ "MD5 Encoding");
}
/* Get the instances for a given digest scheme MD5 or SHA */
MessageDigest m = MessageDigest.getInstance("MD5");
/* Generate the digest. Pass in the text as bytes, length to the
* bytes(offset) to be hashed; for full string pass 0 to text.length()
*/
m.update(data.getBytes(), 0, data.length());
/* Get the String representation of hash bytes, create a big integer
* out of bytes then convert it into hex value (16 as input to
* toString method)
*/
String digest = new BigInteger(1, m.digest()).toString(16);
return digest;
}
当我使用String数据运行上述代码段作为 [12,B006GQIIEM,MH-ANT2000]
,输出是一个31个字符的散列 - 268d43a823933c9dafaa4ac0e756d6a
。
When I run the above code segment with String data as [12, B006GQIIEM, MH-ANT2000]
, the output is a 31 character hash - 268d43a823933c9dafaa4ac0e756d6a
.
MD5哈希函数有什么问题或上面的代码有一些问题吗?
Is there any problem with the MD5 hash function or there is some problem in the code above?
推荐答案
您的代码中唯一的问题是,当 MSB 小于Ox10时,结果散列字符串将只有31个字节,而不是32字节,缺少前导零。
The only issue in your code is when MSB is less than Ox10, the result hash string will only have 31 bytes, instead of 32 bytes, missing the leading zero.
以这种方式创建你的md5字符串:
Create your md5 string in this way:
byte messageDigest[] = m.digest();
hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
String hex=Integer.toHexString(0xFF & messageDigest[i]);
if(hex.length()==1)
hexString.append('0');
hexString.append(hex);
}
这篇关于MD5在Java中生成31个字符的散列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!