MySQL MD5 和 Java MD5 不相等
MySQL 中的下一个函数
MD5( 'secret' )
生成 5ebe2294ecd0e0f08eab7690d2a6ee69
我希望有一个 Java 函数来生成相同的输出。 但
public static String md5( String source ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
byte[] bytes = md.digest( source.getBytes("UTF-8") );
return getString( bytes );
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}
private static String getString( byte[] bytes ) {
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ ) {
byte b = bytes[ i ];
sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
sb.append( "-" );
}
}
return sb.toString();
}
产生
94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
The next function in MySQL
MD5( 'secret' )
generates 5ebe2294ecd0e0f08eab7690d2a6ee69
I would like to have a Java function to generate the same output. But
public static String md5( String source ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
byte[] bytes = md.digest( source.getBytes("UTF-8") );
return getString( bytes );
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}
private static String getString( byte[] bytes ) {
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ ) {
byte b = bytes[ i ];
sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
sb.append( "-" );
}
}
return sb.toString();
}
generates
94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
尝试以 16 为基数进行编码。只是为了让您开始... 16 基数中的 94 是 5E。
**编辑:**尝试更改您的 getString 方法:
Try encoding in base 16. Just to get you started... 94 in base 16 is 5E.
**Edit:**Try changing your getString method:
替换
为
replace
by
通过使用 Apache Commons Codec 库 (http://commons. apache.org/codec)
This can be shortened to a one-liner by using the utility classes from the Apache Commons Codec library (http://commons.apache.org/codec)
这两者是平等的。 Java 似乎是十进制的。 将其转换为十六进制。
Those two are equal. The Java one appears to be in decimal. Convert it to hexadecimal.
那是因为基础不一样。 MySQL MD5 结果以 16 为基数,而 Java MD5 以 10 为基数。
我希望我能进一步帮助你,但我的数学很糟糕。 我的一个朋友帮助我在 PHP 中根据 16 进制校验和生成了 10 进制校验和,但我丢失了脚本。 希望您能在此基础上找到您的答案。
That's because the base is different. The MySQL MD5 result is in base-16, while the Java MD5 is in base-10.
I wish I could help you further, but my math stinks. A friend of mine helped me generate a base-10 checksum from a base-16 checksum in PHP, but I've lost the script. Hope you can find your answer based on this.
考虑将十进制字节转换为十六进制。 例如 94 基数 10 是 5e 基数 16。
Consider converting your decimal bytes to hexadecimal. For example 94 base 10 is 5e base 16.
与其重新发明轮子,不如尝试 Apache commons 编解码器 (http://commons.apache.org/codec/) 它将使用 Hex.encodeHex(byte[]) 为您处理十六进制编码
Rather than reinventing the wheel, try Apache commons codec (http://commons.apache.org/codec/) which will handle the hex encoding for you with Hex.encodeHex(byte[])
使用 Apache Commons Codec 库中的实用程序类:http://commons.apache.org/codec/
Use the utility classes from the Apache Commons Codec library: http://commons.apache.org/codec/
看看我是怎么做的,代码是可以自我解释的!
Java代码:
输出:
MD5:明文:5ab677ec767735cebd67407005786016
产生相同散列的Mysql查询:
输出:
md5('cleartext')
5ab677ec767735cebd67407005786016
Look how I do it, the code is self explainable!
Java code:
Output:
MD5: cleartext: 5ab677ec767735cebd67407005786016
Mysql query that produces the same hash:
Output:
md5('cleartext')
5ab677ec767735cebd67407005786016