You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by cu...@apache.org on 2007/05/22 01:02:46 UTC
svn commit: r540344 - in /lucene/hadoop/branches/branch-0.13: CHANGES.txt
src/java/org/apache/hadoop/io/MD5Hash.java
src/test/org/apache/hadoop/io/TestMD5Hash.java
Author: cutting
Date: Mon May 21 16:02:45 2007
New Revision: 540344
URL: http://svn.apache.org/viewvc?view=rev&rev=540344
Log:
Merge -r 540341:540342 from trunk to 0.13 branch. Fixes: HADOOP-1385.
Modified:
lucene/hadoop/branches/branch-0.13/CHANGES.txt
lucene/hadoop/branches/branch-0.13/src/java/org/apache/hadoop/io/MD5Hash.java
lucene/hadoop/branches/branch-0.13/src/test/org/apache/hadoop/io/TestMD5Hash.java
Modified: lucene/hadoop/branches/branch-0.13/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/branches/branch-0.13/CHANGES.txt?view=diff&rev=540344&r1=540343&r2=540344
==============================================================================
--- lucene/hadoop/branches/branch-0.13/CHANGES.txt (original)
+++ lucene/hadoop/branches/branch-0.13/CHANGES.txt Mon May 21 16:02:45 2007
@@ -407,6 +407,9 @@
122. HADOOP-1388. Fix a potential NullPointerException in web ui.
(Devaraj Das via cutting)
+123. HADOOP-1385. Fix MD5Hash#hashCode() to generally hash to more
+ than 256 values. (omalley via cutting)
+
Release 0.12.3 - 2007-04-06
Modified: lucene/hadoop/branches/branch-0.13/src/java/org/apache/hadoop/io/MD5Hash.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/branches/branch-0.13/src/java/org/apache/hadoop/io/MD5Hash.java?view=diff&rev=540344&r1=540343&r2=540344
==============================================================================
--- lucene/hadoop/branches/branch-0.13/src/java/org/apache/hadoop/io/MD5Hash.java (original)
+++ lucene/hadoop/branches/branch-0.13/src/java/org/apache/hadoop/io/MD5Hash.java Mon May 21 16:02:45 2007
@@ -116,6 +116,17 @@
return value;
}
+ /**
+ * Return a 32-bit digest of the MD5.
+ * @return the first 4 bytes of the md5
+ */
+ public int quarterDigest() {
+ int value = 0;
+ for (int i = 0; i < 4; i++)
+ value |= ((digest[i] & 0xff) << (8*(3-i)));
+ return value;
+ }
+
/** Returns true iff <code>o</code> is an MD5Hash whose digest contains the
* same values. */
public boolean equals(Object o) {
@@ -125,13 +136,11 @@
return Arrays.equals(this.digest, other.digest);
}
- /** Returns a hash code value for this object.*/
+ /** Returns a hash code value for this object.
+ * Only uses the first 4 bytes, since md5s are evenly distributed.
+ */
public int hashCode() {
- return // xor four ints
- (digest[ 0] | (digest[ 1]<<8) | (digest[ 2]<<16) | (digest[ 3]<<24)) ^
- (digest[ 4] | (digest[ 5]<<8) | (digest[ 6]<<16) | (digest[ 7]<<24)) ^
- (digest[ 8] | (digest[ 9]<<8) | (digest[10]<<16) | (digest[11]<<24)) ^
- (digest[12] | (digest[13]<<8) | (digest[14]<<16) | (digest[15]<<24));
+ return quarterDigest();
}
Modified: lucene/hadoop/branches/branch-0.13/src/test/org/apache/hadoop/io/TestMD5Hash.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/branches/branch-0.13/src/test/org/apache/hadoop/io/TestMD5Hash.java?view=diff&rev=540344&r1=540343&r2=540344
==============================================================================
--- lucene/hadoop/branches/branch-0.13/src/test/org/apache/hadoop/io/TestMD5Hash.java (original)
+++ lucene/hadoop/branches/branch-0.13/src/test/org/apache/hadoop/io/TestMD5Hash.java Mon May 21 16:02:45 2007
@@ -46,6 +46,16 @@
MD5Hash md5HashFF
= new MD5Hash(new byte[] {-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1});
+
+ 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});
// test i/o
TestWritable.testWritable(md5Hash);
@@ -67,6 +77,13 @@
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());
}
}