我最近开始看MD5哈希(Java)虽然我发现了算法和方法来帮助我完成这个,我想这是多么它的实际工作。

对于一个我发现了以下从 这个网址:

private static String convertToHex(byte[] data) {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; i++) {
        int halfbyte = (data[i] >>> 4) & 0x0F;
        int two_halfs = 0;
        do {
            if ((0 <= halfbyte) && (halfbyte <= 9))
                buf.append((char) ('0' + halfbyte));
            else
                buf.append((char) ('a' + (halfbyte - 10)));
                halfbyte = data[i] & 0x0F;
            } while(two_halfs++ < 1);
        }
    return buf.toString();
}

我还没有发现任何需要使用的位移在Java所以我有点生疏。有人一种足以说明(在简单的条款)究竟如何上述代码转换?">>>"?

我还发现了其他的解决方案上的计算器,例如 在这里,在这里,, ,其使用BigInteger替代:

try {
   String s = "TEST STRING";
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   md5.update(s.getBytes(),0,s.length());
   String signature = new BigInteger(1,md5.digest()).toString(16);
   System.out.println("Signature: "+signature);

} catch (final NoSuchAlgorithmException e) {
   e.printStackTrace();
}

为什么不这工作太多,并且其方法是更有效率吗?

感谢您的时间。

有帮助吗?

解决方案

private static String convertToHex(byte[] data) {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; i++) {

截至这一点...只是基本建立并开始循环要经过所有的字节数组中的

        int halfbyte = (data[i] >>> 4) & 0x0F;

字节转换时为十六进制为取决于你是什么基它在两个十六进制数字或8组二进制数位。上面的语句将高4位向下(>>>是无符号右移位)和逻辑与运算其与0000 1111,使得结果等于该字节的高4位的整数(第一个十六进制数字)。

说23是一个输入,这是二进制0001 0111。移位使得与逻辑与羽这对0000 0001

        int two_halfs = 0;
        do {

此刚刚建立的do / while循环运行两次

            if ((0 <= halfbyte) && (halfbyte <= 9))
                buf.append((char) ('0' + halfbyte));
            else
                buf.append((char) ('a' + (halfbyte - 10)));

下面我们显示实际十六进制位,基本上只使用零或一个字符作为起点和最多转移到正确的字符。第一if语句覆盖了所有的数字0-9,和第二覆盖所有数字10-15(A-F中十六进制)

再次使用我们的例子0000 0001在十进制等于1我们陷入在上部如果块加1的“0”字符,以获得字符“1”,它添加到字符串并移动上

                halfbyte = data[i] & 0x0F;

现在我们建立整数距离字节并重复等于低比特。

再有,如果我们的输入为23 ... 0001 0111逻辑与后变成只是0000 0111这是十进制7。重复相同的逻辑如上和字符“7”被显示。

            } while(two_halfs++ < 1);

现在我们只移动到下一个字节阵列中,并重复。

        }
    return buf.toString();
}

要回答你的下一个问题是,Java API已经内置于BigInteger的已经基本转换工具。见的toString(INT基数)文档。

不知道由Java API所使用的实现,我不能肯定地说,但我愿意打赌,在Java implenentation比第一稍显简单的算法,你贴得更高效。

其他提示

要回答这个位:

  

为什么这项工作太

它没有。至少,不一样的方式,循环版本一样。新的BigInteger(...)。的toString(16)将不会显示前导零,其中前者将版本。一般为像写出一个字节阵列(特别是一个表示像散)你想一个固定长度的输出,所以如果要使用该版本你必须垫出来适当。

有关bitshifting一个透彻的解释检查出的答案中的以下问题SO 什么是按位移位(位移)运营商和他们是如何工作的?

他似乎试图一个单字节转换成数小于16,通过这样做,他可以很容易地确定至极caracther该字节的代码表示。

  if ((0 <= halfbyte) && (halfbyte <= 9))
                buf.append((char) ('0' + halfbyte));
            else
                buf.append((char) ('a' + (halfbyte - 10)));

这是一个简单的答案,但即时通讯不是亮无论如何= d

这些东西,你不必自己写,因为它已经被写入Apache的公地编解码器:

import org.apache.commons.codec.binary.Hex;
...
Hex.encodeHexString(byte[] array)

有很多在Hex类的更多有用的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top