为整数列表生成MD5哈希

时间:2010-12-28 01:08:15

标签: java md5

我有一个Integer列表

List<Integer> listInt;

我想为listInt生成一个MD5哈希,我应该如何处理这个问题,我知道我必须使用

MessageDigest.getInstance("MD5").digest(byte[])

如何将listInt转换为字节。

3 个答案:

答案 0 :(得分:2)

您需要将每个整数值转换为4个字节,形成长度为4*listInt.size()个字节的字节数组。

这样做的一种方法是使用NIO的ByteBuffer类:

ByteBuffer buf = ByteBuffer.allocate(4*listInt.size());
buf.order(ByteOrder.BIG_ENDIAN);
for (int i = 0; i < listInt.size(); ++i)
    buf.putInt(listInt.get(i));
byte[] barr = buf.array();

请注意,将整数数组转换为字节数组有两种常用方法。然而,差异只是Endianness的选择。有些人选择计算整数的Big Endian字节表示;其他人选择计算整数的小Endian表示。只要您一致地计算每个整数的字节表示,选择哪种方法都无关紧要。

答案 1 :(得分:1)

首先创建一个将int转换为字节数组的方法:

  public static final byte[] intToByteArray(int value) 
  { 
    return new byte[]  { (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };
  }

然后使用ByteArrayOutputStream。

ByteArrayOutputStream baos = new ByteArrayOutputStream();

for (int i = 0; i < listInt.size(); i++)
{
  baos.write(intToByteArray(listInt[i]), 0, 4);
}

然后,您将获得完整的字节数组,以执行md5哈希:

byte[] fullByteArray = baos.toByteArray();

答案 2 :(得分:0)

byte data[] = new byte[listInt.size()*4];
for (int i = 0; i < listInt.size(); i++) {
  data[i*4]   = new Integer(listInt.get(i) >> 24).byteValue();
  data[i*4+1] = new Integer(listInt.get(i) >> 16).byteValue();
  data[i*4+2] = new Integer(listInt.get(i) >> 8).byteValue();
  data[i*4+3] = listInt.get(i).byteValue();
}

示例代码正在运行:http://ideone.com/YJZVj