/*
* File: Murmur32HashTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Feb 1, 2011, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.hash;
/**
* Unit tests for Murmur32HashTest.
*
* @author krdixon
*/
public class Murmur32HashTest
extends HashFunctionTestHarness
{
/**
* Tests for class Murmur32HashTest.
* @param testName Name of the test.
*/
public Murmur32HashTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class Murmur32HashTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
Murmur32Hash instance = new Murmur32Hash();
assertNotNull( instance );
}
@Override
public Murmur32Hash createInstance()
{
return new Murmur32Hash();
}
@Override
public void testLength()
{
System.out.println( "length" );
Murmur32Hash instance = this.createInstance();
assertEquals( 4, instance.length() );
assertEquals( 4, Murmur32Hash.LENGTH );
}
/** Fill a key with a known pattern (incrementing numbers) */
private void setKey(
byte [] key,
int start)
{
for (int i = 0; i < key.length; i++)
{
key[i] = (byte) ((start + i) & 0xFF);
}
}
public void testRelativeEntropy()
{
System.out.println( "Relative Entropy" );
//Hash Average Time: 1.855
//Total Average Time: 11.687
//Relative Entropy = 1.7613951882111678E-4
double entropy = this.computeRelativeEntropy( 1000 );
System.out.println( "Relative Entropy = " + entropy );
}
@Override
public void testEvaluateKnownValues()
{
// Taken from:
// http://dmy999.com/article/50/murmurhash-2-java-port
System.out.println( "evaluate known values" );
byte [] key = new byte[133];
int [] expected = { 0xd743ae0b, 0xf1b461c6, 0xa45a6ceb, 0xdb15e003,
0x877721a4, 0xc30465f1, 0xfb658ba4, 0x1adf93b2,
0xe40a7931, 0x3da52db0, 0xbf523511, 0x1efaf273,
0xe628c1dd, 0x9a0344df, 0x901c99fc, 0x5ae1aa44 };
for (int i = 0; i < 16; i++) {
// keep seed constant, generate a known key pattern
setKey(key, i);
int expectedHash = expected[i];
int hash = Murmur32Hash.hash(key, 0x1234ABCD);
assertEquals("i = " + i, expectedHash, hash);
}
}
public void testChangingKeyLength()
{
// Taken from:
// http://dmy999.com/article/50/murmurhash-2-java-port
System.out.println( "changing key length" );
int [] expected = { 0xa0c72f8e, 0x29c2f97e, 0x00ca8bba, 0x88387876,
0xe203ce49, 0x58d75952, 0xab84febe, 0x98153c65,
0xcbb38375, 0x6ea1a28b, 0x9afa8f55, 0xfb890eb6,
0x9516cc49, 0x6408a8eb, 0xbb12d3e6, 0x00fb7519 };
// vary the key and the length
for (int i = 0; i < 16; i++)
{
byte [] key = new byte[i];
setKey(key, i);
int expectedHash = expected[i];
int hash = Murmur32Hash.hash(key, 0x7870AAFF);
assertEquals("i = " + i, expectedHash, hash);
}
}
/**
* test using a fixed key and a changing seed
*/
public void testChangingSeed()
{
// Taken from:
// http://dmy999.com/article/50/murmurhash-2-java-port
// use a fixed key
byte [] key = new byte[]
{
0x4E, (byte) 0xE3, (byte) 0x91, 0x00,
0x10, (byte) 0x8F, (byte) 0xFF
};
int [] expected =
{
0xeef8be32, 0x8109dec6, 0x9aaf4192, 0xc1bcaf1c,
0x821d2ce4, 0xd45ed1df, 0x6c0357a7, 0x21d4e845,
0xfa97db50, 0x2f1985c8, 0x5d69782a, 0x0d6e4b85,
0xe7d9cf6b, 0x337e6b49, 0xe1606944, 0xccc18ae8
};
for (int i = 0; i < expected.length; i++)
{
int expectedHash = expected[i];
int hash = Murmur32Hash.hash(key, i);
assertEquals("i = " + i, expectedHash, hash);
}
}
}