Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MD5散列是不同的_Java_Php_String_Md5_Hex - Fatal编程技术网

Java MD5散列是不同的

Java MD5散列是不同的,java,php,string,md5,hex,Java,Php,String,Md5,Hex,我不知道如何实现从php到java的这几行 $varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/> $result = md5($varInHex); echo $result; $varInHex=“\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x

我不知道如何实现从php到java的这几行

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/>
$result = md5($varInHex);
echo $result;
$varInHex=“\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36”

$result=md5($varInHex); 回声$结果;
嗯,我试图转换它,但我得到了一个不同的结果

byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...};
String str = seq20.toString();
String result = md5(str);
System.out.println(result);

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];
        String hex = Integer.toHexString((int) 0x00FF & b);
        if (hex.length() == 1) {
            sb.append("0");
        }
        sb.append(hex);
    }
    return sb.toString();
}
byte[]seq20=新字节[]{(字节)0x22,(字节)…等;
字符串str=seq20.toString();
字符串结果=md5(str);
系统输出打印项次(结果);
公共静态字符串md5(字符串源){
试一试{
MessageDigest md=MessageDigest.getInstance(“MD5”);
byte[]bytes=md.digest(source.getBytes(“UTF-8”);
返回getString(字节);
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
私有静态字符串getString(字节[]字节){
StringBuffer sb=新的StringBuffer();
for(int i=0;i
java中的结果与php中的结果不同

你能帮我吗??
提前感谢:)

我猜PHP是将上述内容作为字符串而不是十六进制进行评估的。Java正在按照您的期望进行操作。

您不能直接使用seq20而不将其转换为字符串吗? 我会这样做:

md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
while ( output.length() < 32 ) {
    output = "0"+output;
}
md.update(seq20);
字节[]md5sum=md.digest();
biginger bigInt=新的biginger(1,md5sum);
输出=bigInt.toString(16);
while(output.length()<32){
输出=“0”+输出;
}

公认的解决方案:

md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
if ( output.length() == 31 ) {
    output = "0"+output;
}
包含一个将失败1/256次的实现,因为md5sum的输出可以有多个前导零。引发此错误的示例md5输入是:“15446:68106”(不带引号)


推荐使用Apache公文,如果你需要一个与PHP实现相匹配的MD5。

< P>这两个答案都不是肯定错误的,但是从优雅的角度来看,考虑下面的

String MD5(String... strings) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
        for(final String s : strings) {
            md.update(s.getBytes());
        }
    } catch (NoSuchAlgorithmException ex) {
        throw new RuntimeException("MD5 Cryptography Not Supported");
    }
    final BigInteger bigInt = new BigInteger(1, md.digest());
    return String.format("%032x", bigInt);
}

edit:使用
String…
varargs是完全可选的,但它使函数更容易一些,因为它避免了调用函数中字符串连接的开销。

请参阅@adves提供的答案。这是一个很好的教训:如果你能帮助解决常见问题,就不要使用自己的解决方案,因为你将不可避免地出错。@amalloy谢谢你的提示,我已经解决了这个问题。我刚刚实现了这个解决方案,我要说我非常喜欢它。