aboutsummaryrefslogtreecommitdiffstats
path: root/guava-tests/test/com/google/common/hash/HashFunctionsTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava-tests/test/com/google/common/hash/HashFunctionsTest.java')
-rw-r--r--guava-tests/test/com/google/common/hash/HashFunctionsTest.java74
1 files changed, 74 insertions, 0 deletions
diff --git a/guava-tests/test/com/google/common/hash/HashFunctionsTest.java b/guava-tests/test/com/google/common/hash/HashFunctionsTest.java
new file mode 100644
index 0000000..f9fd6c4
--- /dev/null
+++ b/guava-tests/test/com/google/common/hash/HashFunctionsTest.java
@@ -0,0 +1,74 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.common.hash;
+
+import com.google.common.collect.Sets;
+
+import junit.framework.TestCase;
+
+import java.util.Set;
+
+/**
+ * Tests for HashFunctions.
+ *
+ * @author andreou@google.com (Dimitris Andreou)
+ */
+public class HashFunctionsTest extends TestCase {
+ public void testMd5() {
+ assertInvariants(Hashing.md5());
+ }
+
+ public void testMurmur3_138() {
+ assertInvariants(Hashing.murmur3_128());
+ }
+
+ public void testMurmur3_32() {
+ assertInvariants(Hashing.murmur3_32());
+ }
+
+ public void testGoodFastHash() {
+ for (int i = 1; i < 500; i++) {
+ HashFunction hasher = Hashing.goodFastHash(i);
+ assertTrue(hasher.bits() >= i);
+ assertInvariants(hasher);
+ }
+ }
+
+ /**
+ * Checks that a Hasher returns the same HashCode when given the same input, and also
+ * that the collision rate looks sane.
+ */
+ private static void assertInvariants(HashFunction hashFunction) {
+ int objects = 100;
+ Set<HashCode> hashcodes = Sets.newHashSetWithExpectedSize(objects);
+ for (int i = 0; i < objects; i++) {
+ Object o = new Object();
+ HashCode hashcode1 = hashFunction.newHasher().putObject(o, HashTestUtils.BAD_FUNNEL).hash();
+ HashCode hashcode2 = hashFunction.newHasher().putObject(o, HashTestUtils.BAD_FUNNEL).hash();
+ assertEquals(hashcode1, hashcode2); // idempotent
+ assertEquals(hashFunction.bits(), hashcode1.bits());
+ assertEquals(hashFunction.bits(), hashcode1.asBytes().length * 8);
+ hashcodes.add(hashcode1);
+ }
+ assertTrue(hashcodes.size() > objects * 0.95); // quite relaxed test
+
+ assertHashBytesThrowsCorrectExceptions(hashFunction);
+ }
+
+ private static void assertHashBytesThrowsCorrectExceptions(HashFunction hashFunction) {
+ hashFunction.hashBytes(new byte[64], 0, 0);
+
+ try {
+ hashFunction.hashBytes(new byte[128], -1, 128);
+ fail();
+ } catch (IndexOutOfBoundsException ok) {}
+ try {
+ hashFunction.hashBytes(new byte[128], 64, 256 /* too long len */);
+ fail();
+ } catch (IndexOutOfBoundsException ok) {}
+ try {
+ hashFunction.hashBytes(new byte[64], 0, -1);
+ fail();
+ } catch (IndexOutOfBoundsException ok) {}
+ }
+}