sangupta / murmur

Pure Java implementations of Murmur hash algorithms
Apache License 2.0
72 stars 21 forks source link

Murmur3 gives out different hash values for the same input #7

Open KingBoomie opened 5 years ago

KingBoomie commented 5 years ago

Running in jshell

import com.sangupta.murmur.Murmur3;

byte[] data2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1};
Murmur3.hash_x64_128(data2, data2.length, 0);
Murmur3.hash_x64_128(data2, data2.length, 0);
Murmur3.hash_x64_128(data2, data2.length, 0);

Murmur3.hash_x64_128(data2, data2.length, 0);

returns

import com.sangupta.murmur.Murmur3
field byte[] data2 = byte[17] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 }
Murmur3.hash_x64_128(data2, data2.length, 0); = long[2] { 2108477303888159446, 3080087960434196035 }
Murmur3.hash_x64_128(data2, data2.length, 0); = long[2] { -5533461732917773897, -8684579065263202028 }
Murmur3.hash_x64_128(data2, data2.length, 0); = long[2] { -5533461732917773897, -8684579065263202028 }
Murmur3.hash_x64_128(data2, data2.length, 0); = long[2] { -5533461732917773897, -8684579065263202028 }

Expected all return values to be equal. running OracleJDK 12.0.2.

sangupta commented 5 years ago

@KingBoomie The byte-array is modified after the first run of the hash pass:

@Test
public void test() {
    byte[] data2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1};
    byte[] data3 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1};

    final long seed = new Random().nextLong();      
    long[] initial = Murmur3.hash_x64_128(data2, data2.length, seed);

    System.out.println(Arrays.toString(data2));
    Assert.assertArrayEquals(data2, data3); // this fails
}

The data2 is modified to:

[-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]

I will debug further to see why this happens.