11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.hash;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Lists;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.util.concurrent.AtomicLongMap;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Random;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit tests for functions of {@code Hashing} that don't have their own tests.
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class HashingTest extends TestCase {
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPadToLong() {
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0x1111111111111111L, Hashing.padToLong(HashCodes.fromLong(0x1111111111111111L)));
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0x9999999999999999L, Hashing.padToLong(HashCodes.fromLong(0x9999999999999999L)));
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0x0000000011111111L, Hashing.padToLong(HashCodes.fromInt(0x11111111)));
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0x0000000099999999L, Hashing.padToLong(HashCodes.fromInt(0x99999999)));
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsistentHash_correctness() {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    long[] interestingValues = { -1, 0, 1, 2, Long.MAX_VALUE, Long.MIN_VALUE };
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (long h : interestingValues) {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkConsistentHashCorrectness(h);
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Random r = new Random(7);
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 20; i++) {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkConsistentHashCorrectness(r.nextLong());
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void checkConsistentHashCorrectness(long hashCode) {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int last = 0;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int shards = 1; shards <= 100000; shards++) {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int b = Hashing.consistentHash(hashCode, shards);
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (b != last) {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(shards - 1, b);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        last = b;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsistentHash_probabilities() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    AtomicLongMap<Integer> map = AtomicLongMap.create();
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Random r = new Random(9);
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < ITERS; i++) {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      countRemaps(r.nextLong(), map);
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int shard = 2; shard <= MAX_SHARDS; shard++) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Rough: don't exceed 1.2x the expected number of remaps by more than 20
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(map.get(shard) <= 1.2 * ITERS / shard + 20);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void countRemaps(long h, AtomicLongMap<Integer> map) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int last = 0;
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int shards = 2; shards <= MAX_SHARDS; shards++) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int chosen = Hashing.consistentHash(h, shards);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (chosen != last) {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.incrementAndGet(shards);
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        last = chosen;
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final int ITERS = 10000;
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final int MAX_SHARDS = 500;
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsistentHash_outOfRange() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.consistentHash(5L, 0);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsistentHash_ofHashCode() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSameResult(HashCodes.fromLong(1), 1);
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSameResult(HashCodes.fromLong(0x9999999999999999L), 0x9999999999999999L);
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkSameResult(HashCodes.fromInt(0x99999999), 0x0000000099999999L);
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void checkSameResult(HashCode hashCode, long equivLong) {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Hashing.consistentHash(equivLong, 5555), Hashing.consistentHash(hashCode, 5555));
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineOrdered_null() {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineOrdered(null);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineOrdered_empty() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineOrdered(Collections.<HashCode>emptySet());
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineOrdered_differentBitLengths() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineOrdered(ImmutableList.of(HashCodes.fromInt(32), HashCodes.fromLong(32L)));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineOrdered() {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hash31 = HashCodes.fromInt(31);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hash32 = HashCodes.fromInt(32);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(hash32, Hashing.combineOrdered(ImmutableList.of(hash32)));
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashCodes.fromBytes(new byte[] { (byte) 0x80, 0, 0, 0 }),
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineOrdered(ImmutableList.of(hash32, hash32)));
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashCodes.fromBytes(new byte[] { (byte) 0xa0, 0, 0, 0 }),
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineOrdered(ImmutableList.of(hash32, hash32, hash32)));
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineOrdered(ImmutableList.of(hash31, hash32)).equals(
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineOrdered(ImmutableList.of(hash32, hash31))));
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineOrdered_randomHashCodes() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Random random = new Random(7);
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<HashCode> hashCodes = Lists.newArrayList();
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 10; i++) {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      hashCodes.add(HashCodes.fromLong(random.nextLong()));
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hashCode1 = Hashing.combineOrdered(hashCodes);
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.shuffle(hashCodes, random);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hashCode2 = Hashing.combineOrdered(hashCodes);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(hashCode1.equals(hashCode2));
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineUnordered_null() {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineUnordered(null);
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineUnordered_empty() {
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineUnordered(Collections.<HashCode>emptySet());
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineUnordered_differentBitLengths() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Hashing.combineUnordered(ImmutableList.of(HashCodes.fromInt(32), HashCodes.fromLong(32L)));
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineUnordered() {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hash31 = HashCodes.fromInt(31);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hash32 = HashCodes.fromInt(32);
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(hash32, Hashing.combineUnordered(ImmutableList.of(hash32)));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashCodes.fromInt(64), Hashing.combineUnordered(ImmutableList.of(hash32, hash32)));
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashCodes.fromInt(96),
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineUnordered(ImmutableList.of(hash32, hash32, hash32)));
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineUnordered(ImmutableList.of(hash31, hash32)),
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Hashing.combineUnordered(ImmutableList.of(hash32, hash31)));
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCombineUnordered_randomHashCodes() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Random random = new Random();
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<HashCode> hashCodes = Lists.newArrayList();
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 10; i++) {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      hashCodes.add(HashCodes.fromLong(random.nextLong()));
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hashCode1 = Hashing.combineUnordered(hashCodes);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.shuffle(hashCodes);
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashCode hashCode2 = Hashing.combineUnordered(hashCodes);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(hashCode1, hashCode2);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
205