Java和php5 MD5哈希之间的差异

Java和php5 MD5哈希之间的差异,java,php,md5,Java,Php,Md5,我面临一个奇怪的问题,它与Java和php5中的MD5哈希有关。 我认为在某些情况下,下面的代码不会 生成正确的MD5哈希: public static String getMD5Hash(String string) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(string.getBytes()); byte[] digest

我面临一个奇怪的问题,它与Java和php5中的MD5哈希有关。 我认为在某些情况下,下面的代码不会 生成正确的MD5哈希:

public static String getMD5Hash(String string)
{
    try 
    {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(string.getBytes());
        byte[] digest = md5.digest();

        string = byteArrToHexString(digest);
    } 
    catch (NoSuchAlgorithmException e1) 
    {
        e1.printStackTrace();
    }

    return string;
}

private static String byteArrToHexString(byte[] bArr)
{
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < bArr.length; i++) 
    {
        int unsigned = bArr[i] & 0xff;
        sb.append(Integer.toHexString((unsigned)));
    }

    return sb.toString();
}
公共静态字符串getMD5Hash(字符串)
{
尝试
{
MessageDigest md5=MessageDigest.getInstance(“md5”);
md5.update(string.getBytes());
字节[]摘要=md5.digest();
string=bytearrtohextstring(摘要);
} 
捕获(无算法异常e1)
{
e1.printStackTrace();
}
返回字符串;
}
私有静态字符串ByteArrtoHextString(字节[]bArr)
{
StringBuffer sb=新的StringBuffer();
for(int i=0;i
我必须迁移一个现有的用户数据库,其中存储了密码 在php5-MD5中。现在,有些用户(不是所有用户)无法登录,因为我的Java代码 未生成正确的MD5哈希

你知道上面有什么问题吗?

你错过了:

md5.reset();
在执行更新()之前

检查您缺少的内容:

md5.reset();
在执行更新()之前


Check

byteArrToHexString
不转换字节
byteArrToHexString
不转换字节太有趣了。。。我自己刚刚遇到了MD5哈希密码的问题。我的问题是将原始密码编码为
字节[]

我建议您准确地找出之前用于散列密码的编码,并将上面代码的第6行更改为

md5.update(string.getBytes("UTF-8"));
(当然,这只是一个示例……找出要用作参数的正确字符集)

顺便说一句,我想你有你的理由,但为什么不让散列方法这样做呢

return new String(digest, "UTF-8");

Yuval=8-

真有趣。。。我自己刚刚遇到了MD5哈希密码的问题。我的问题是将原始密码编码为
字节[]

我建议您准确地找出之前用于散列密码的编码,并将上面代码的第6行更改为

md5.update(string.getBytes("UTF-8"));
(当然,这只是一个示例……找出要用作参数的正确字符集)

顺便说一句,我想你有你的理由,但为什么不让散列方法这样做呢

return new String(digest, "UTF-8");
Yuval=8-

我找到了两种解决方案(从其他答案中找到):

根据一些基准测试,我可以说
md5
函数的速度大约是
md5Hex
函数的两倍。以下是测试:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        AsyncTask.execute {
            val emailList=ArrayList<String>()
            for (i in 0 until 100000)
                emailList.add( generateRandomEmail(10))
            var startTime = System.currentTimeMillis()
            for (email in emailList)
                MD5Util.md5(email)
            var endTime = System.currentTimeMillis()
            Log.d("AppLog", "md5 - time taken: ${endTime - startTime}")
            startTime = System.currentTimeMillis()
            for (email in emailList)
                MD5Util.md5Hex(email)
            endTime = System.currentTimeMillis()
            Log.d("AppLog", "md5Hex - time taken: ${endTime - startTime}")
        }
    }

    companion object {
        private const val ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyz" + "1234567890" + "_-."

        @Suppress("SpellCheckingInspection")
        fun generateRandomEmail(@IntRange(from = 1) localEmailLength: Int, host: String = "gmail.com"): String {
            val firstLetter = RandomStringUtils.random(1, 'a'.toInt(), 'z'.toInt(), false, false)
            val temp = if (localEmailLength == 1) "" else RandomStringUtils.random(localEmailLength - 1, ALLOWED_CHARS)
            return "$firstLetter$temp@$host"
        }
    }
}
我找到了两种解决方案(从其他答案中找到):

根据一些基准测试,我可以说
md5
函数的速度大约是
md5Hex
函数的两倍。以下是测试:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        AsyncTask.execute {
            val emailList=ArrayList<String>()
            for (i in 0 until 100000)
                emailList.add( generateRandomEmail(10))
            var startTime = System.currentTimeMillis()
            for (email in emailList)
                MD5Util.md5(email)
            var endTime = System.currentTimeMillis()
            Log.d("AppLog", "md5 - time taken: ${endTime - startTime}")
            startTime = System.currentTimeMillis()
            for (email in emailList)
                MD5Util.md5Hex(email)
            endTime = System.currentTimeMillis()
            Log.d("AppLog", "md5Hex - time taken: ${endTime - startTime}")
        }
    }

    companion object {
        private const val ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyz" + "1234567890" + "_-."

        @Suppress("SpellCheckingInspection")
        fun generateRandomEmail(@IntRange(from = 1) localEmailLength: Int, host: String = "gmail.com"): String {
            val firstLetter = RandomStringUtils.random(1, 'a'.toInt(), 'z'.toInt(), false, false)
            val temp = if (localEmailLength == 1) "" else RandomStringUtils.random(localEmailLength - 1, ALLOWED_CHARS)
            return "$firstLetter$temp@$host"
        }
    }
}

由于每次都创建新的MessageDigest对象,因此不应成为问题。如果重复使用同一对象,则需要重置。添加此项后,没有结果。反正是Thx!由于每次都创建新的MessageDigest对象,因此不应成为问题。如果重复使用同一对象,则需要重置。添加此项后,没有结果。反正是Thx!Sry,你能给我一个片段吗?恐怕没有弄好。编辑后添加了填充示例。谢谢,你的回答很有帮助。你能给我一个片段吗?恐怕没有弄好。编辑后添加了填充示例。谢谢,您的回答非常有用