MD5Hash implements WritableComparable<MD5Hash> { public MD5Hash() { this.digest = new byte[MD5_LEN]; } MD5Hash();  MD5Hash(String hex);  MD5Hash(byte[] digest); @Override void readFields(DataInput in); static MD5Hash read(DataInput in); @Override void write(DataOutput out); void set(MD5Hash that); byte[] getDigest(); static MD5Hash digest(byte[] data); static MessageDigest getDigester(); static MD5Hash digest(InputStream in); static MD5Hash digest(byte[] data, int start, int len); static MD5Hash digest(String string); static MD5Hash digest(UTF8 utf8); long halfDigest(); int quarterDigest(); @Override boolean equals(Object o); @Override int hashCode(); @Override int compareTo(MD5Hash that); @Override String toString(); void setDigest(String hex); static final int MD5_LEN; }
@Test public void testMD5Hash() throws Exception { MD5Hash md5Hash = getTestHash(); final MD5Hash md5Hash00 = new MD5Hash(D00); final MD5Hash md5HashFF = new MD5Hash(DFF); MD5Hash orderedHash = new MD5Hash(new byte[]{1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16}); MD5Hash backwardHash = new MD5Hash(new byte[]{-1,-2,-3,-4,-5,-6,-7,-8, -9,-10,-11,-12, -13, -14, -15,-16}); MD5Hash closeHash1 = new MD5Hash(new byte[]{-1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}); MD5Hash closeHash2 = new MD5Hash(new byte[]{-1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}); TestWritable.testWritable(md5Hash); TestWritable.testWritable(md5Hash00); TestWritable.testWritable(md5HashFF); assertEquals(md5Hash, md5Hash); assertEquals(md5Hash00, md5Hash00); assertEquals(md5HashFF, md5HashFF); assertTrue(md5Hash.compareTo(md5Hash) == 0); assertTrue(md5Hash00.compareTo(md5Hash) < 0); assertTrue(md5HashFF.compareTo(md5Hash) > 0); assertEquals(md5Hash, new MD5Hash(md5Hash.toString())); assertEquals(md5Hash00, new MD5Hash(md5Hash00.toString())); assertEquals(md5HashFF, new MD5Hash(md5HashFF.toString())); assertEquals(0x01020304, orderedHash.quarterDigest()); assertEquals(0xfffefdfc, backwardHash.quarterDigest()); assertEquals(0x0102030405060708L, orderedHash.halfDigest()); assertEquals(0xfffefdfcfbfaf9f8L, backwardHash.halfDigest()); assertTrue("hash collision", closeHash1.hashCode() != closeHash2.hashCode()); Thread t1 = new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) { MD5Hash hash = new MD5Hash(DFF); assertEquals(hash, md5HashFF); } } }; Thread t2 = new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) { MD5Hash hash = new MD5Hash(D00); assertEquals(hash, md5Hash00); } } }; t1.start(); t2.start(); t1.join(); t2.join(); }