001/*
002 * Copyright (C) 2011 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 */
014
015package com.google.common.hash;
016
017import static com.google.common.base.Preconditions.checkArgument;
018import static com.google.common.base.Preconditions.checkNotNull;
019
020import com.google.common.annotations.Beta;
021import com.google.common.base.Supplier;
022import java.security.Key;
023import java.security.MessageDigest;
024import java.util.ArrayList;
025import java.util.Arrays;
026import java.util.Iterator;
027import java.util.List;
028import java.util.zip.Adler32;
029import java.util.zip.CRC32;
030import java.util.zip.Checksum;
031import javax.annotation.Nullable;
032import javax.crypto.spec.SecretKeySpec;
033
034/**
035 * Static methods to obtain {@link HashFunction} instances, and other static hashing-related
036 * utilities.
037 *
038 * <p>A comparison of the various hash functions can be found
039 * <a href="http://goo.gl/jS7HH">here</a>.
040 *
041 * @author Kevin Bourrillion
042 * @author Dimitris Andreou
043 * @author Kurt Alfred Kluever
044 * @since 11.0
045 */
046@Beta
047public final class Hashing {
048  /**
049   * Returns a general-purpose, <b>temporary-use</b>, non-cryptographic hash function. The algorithm
050   * the returned function implements is unspecified and subject to change without notice.
051   *
052   * <p><b>Warning:</b> a new random seed for these functions is chosen each time the {@code
053   * Hashing} class is loaded. <b>Do not use this method</b> if hash codes may escape the current
054   * process in any way, for example being sent over RPC, or saved to disk.
055   *
056   * <p>Repeated calls to this method on the same loaded {@code Hashing} class, using the same value
057   * for {@code minimumBits}, will return identically-behaving {@link HashFunction} instances.
058   *
059   * @param minimumBits a positive integer (can be arbitrarily large)
060   * @return a hash function, described above, that produces hash codes of length {@code
061   *     minimumBits} or greater
062   */
063  public static HashFunction goodFastHash(int minimumBits) {
064    int bits = checkPositiveAndMakeMultipleOf32(minimumBits);
065
066    if (bits == 32) {
067      return Murmur3_32Holder.GOOD_FAST_HASH_FUNCTION_32;
068    }
069    if (bits <= 128) {
070      return Murmur3_128Holder.GOOD_FAST_HASH_FUNCTION_128;
071    }
072
073    // Otherwise, join together some 128-bit murmur3s
074    int hashFunctionsNeeded = (bits + 127) / 128;
075    HashFunction[] hashFunctions = new HashFunction[hashFunctionsNeeded];
076    hashFunctions[0] = Murmur3_128Holder.GOOD_FAST_HASH_FUNCTION_128;
077    int seed = GOOD_FAST_HASH_SEED;
078    for (int i = 1; i < hashFunctionsNeeded; i++) {
079      seed += 1500450271; // a prime; shouldn't matter
080      hashFunctions[i] = murmur3_128(seed);
081    }
082    return new ConcatenatedHashFunction(hashFunctions);
083  }
084
085  /**
086   * Used to randomize {@link #goodFastHash} instances, so that programs which persist anything
087   * dependent on the hash codes they produce will fail sooner.
088   */
089  private static final int GOOD_FAST_HASH_SEED = (int) System.currentTimeMillis();
090
091  /**
092   * Returns a hash function implementing the
093   * <a href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
094   * algorithm, x86 variant</a> (little-endian variant), using the given seed value.
095   *
096   * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
097   */
098  public static HashFunction murmur3_32(int seed) {
099    return new Murmur3_32HashFunction(seed);
100  }
101
102  /**
103   * Returns a hash function implementing the
104   * <a href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
105   * algorithm, x86 variant</a> (little-endian variant), using a seed value of zero.
106   *
107   * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
108   */
109  public static HashFunction murmur3_32() {
110    return Murmur3_32Holder.MURMUR3_32;
111  }
112
113  private static class Murmur3_32Holder {
114    static final HashFunction MURMUR3_32 = new Murmur3_32HashFunction(0);
115
116    /** Returned by {@link #goodFastHash} when {@code minimumBits <= 32}. */
117    static final HashFunction GOOD_FAST_HASH_FUNCTION_32 = murmur3_32(GOOD_FAST_HASH_SEED);
118  }
119
120  /**
121   * Returns a hash function implementing the
122   * <a href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">128-bit murmur3
123   * algorithm, x64 variant</a> (little-endian variant), using the given seed value.
124   *
125   * <p>The exact C++ equivalent is the MurmurHash3_x64_128 function (Murmur3F).
126   */
127  public static HashFunction murmur3_128(int seed) {
128    return new Murmur3_128HashFunction(seed);
129  }
130
131  /**
132   * Returns a hash function implementing the
133   * <a href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">128-bit murmur3
134   * algorithm, x64 variant</a> (little-endian variant), using a seed value of zero.
135   *
136   * <p>The exact C++ equivalent is the MurmurHash3_x64_128 function (Murmur3F).
137   */
138  public static HashFunction murmur3_128() {
139    return Murmur3_128Holder.MURMUR3_128;
140  }
141
142  private static class Murmur3_128Holder {
143    static final HashFunction MURMUR3_128 = new Murmur3_128HashFunction(0);
144
145    /** Returned by {@link #goodFastHash} when {@code 32 < minimumBits <= 128}. */
146    static final HashFunction GOOD_FAST_HASH_FUNCTION_128 = murmur3_128(GOOD_FAST_HASH_SEED);
147  }
148
149  /**
150   * Returns a hash function implementing the <a href="https://131002.net/siphash/">64-bit
151   * SipHash-2-4 algorithm</a> using a seed value of {@code k = 00 01 02 ...}.
152   *
153   * @since 15.0
154   */
155  public static HashFunction sipHash24() {
156    return SipHash24Holder.SIP_HASH_24;
157  }
158
159  private static class SipHash24Holder {
160    static final HashFunction SIP_HASH_24 =
161        new SipHashFunction(2, 4, 0x0706050403020100L, 0x0f0e0d0c0b0a0908L);
162  }
163
164  /**
165   * Returns a hash function implementing the <a href="https://131002.net/siphash/">64-bit
166   * SipHash-2-4 algorithm</a> using the given seed.
167   *
168   * @since 15.0
169   */
170  public static HashFunction sipHash24(long k0, long k1) {
171    return new SipHashFunction(2, 4, k0, k1);
172  }
173
174  /**
175   * Returns a hash function implementing the MD5 hash algorithm (128 hash bits) by delegating to
176   * the MD5 {@link MessageDigest}.
177   *
178   * <p><b>Warning:</b> MD5 is not cryptographically secure or collision-resistant and is not
179   * recommended for use in new code. It should be used for legacy compatibility reasons only.
180   * Please consider using a hash function in the SHA-2 family of functions (e.g., SHA-256).
181   */
182  public static HashFunction md5() {
183    return Md5Holder.MD5;
184  }
185
186  private static class Md5Holder {
187    static final HashFunction MD5 = new MessageDigestHashFunction("MD5", "Hashing.md5()");
188  }
189
190  /**
191   * Returns a hash function implementing the SHA-1 algorithm (160 hash bits) by delegating to the
192   * SHA-1 {@link MessageDigest}.
193   *
194   * <p><b>Warning:</b> SHA1 is not cryptographically secure and is not recommended for use in new
195   * code. It should be used for legacy compatibility reasons only. Please consider using a hash
196   * function in the SHA-2 family of functions (e.g., SHA-256).
197   */
198  public static HashFunction sha1() {
199    return Sha1Holder.SHA_1;
200  }
201
202  private static class Sha1Holder {
203    static final HashFunction SHA_1 = new MessageDigestHashFunction("SHA-1", "Hashing.sha1()");
204  }
205
206  /**
207   * Returns a hash function implementing the SHA-256 algorithm (256 hash bits) by delegating to the
208   * SHA-256 {@link MessageDigest}.
209   */
210  public static HashFunction sha256() {
211    return Sha256Holder.SHA_256;
212  }
213
214  private static class Sha256Holder {
215    static final HashFunction SHA_256 =
216        new MessageDigestHashFunction("SHA-256", "Hashing.sha256()");
217  }
218
219  /**
220   * Returns a hash function implementing the SHA-384 algorithm (384 hash bits) by delegating to the
221   * SHA-384 {@link MessageDigest}.
222   *
223   * @since 19.0
224   */
225  public static HashFunction sha384() {
226    return Sha384Holder.SHA_384;
227  }
228
229  private static class Sha384Holder {
230    static final HashFunction SHA_384 =
231        new MessageDigestHashFunction("SHA-384", "Hashing.sha384()");
232  }
233
234  /**
235   * Returns a hash function implementing the SHA-512 algorithm (512 hash bits) by delegating to the
236   * SHA-512 {@link MessageDigest}.
237   */
238  public static HashFunction sha512() {
239    return Sha512Holder.SHA_512;
240  }
241
242  private static class Sha512Holder {
243    static final HashFunction SHA_512 =
244        new MessageDigestHashFunction("SHA-512", "Hashing.sha512()");
245  }
246
247  /**
248   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
249   * MD5 (128 hash bits) hash function and the given secret key.
250   *
251   *
252   * @param key the secret key
253   * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
254   * @since 20.0
255   */
256  public static HashFunction hmacMd5(Key key) {
257    return new MacHashFunction("HmacMD5", key, hmacToString("hmacMd5", key));
258  }
259
260  /**
261   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
262   * MD5 (128 hash bits) hash function and a {@link SecretSpecKey} created from the given byte array
263   * and the MD5 algorithm.
264   *
265   *
266   * @param key the key material of the secret key
267   * @since 20.0
268   */
269  public static HashFunction hmacMd5(byte[] key) {
270    return hmacMd5(new SecretKeySpec(checkNotNull(key), "HmacMD5"));
271  }
272
273  /**
274   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
275   * SHA-1 (160 hash bits) hash function and the given secret key.
276   *
277   *
278   * @param key the secret key
279   * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
280   * @since 20.0
281   */
282  public static HashFunction hmacSha1(Key key) {
283    return new MacHashFunction("HmacSHA1", key, hmacToString("hmacSha1", key));
284  }
285
286  /**
287   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
288   * SHA-1 (160 hash bits) hash function and a {@link SecretSpecKey} created from the given byte
289   * array and the SHA-1 algorithm.
290   *
291   *
292   * @param key the key material of the secret key
293   * @since 20.0
294   */
295  public static HashFunction hmacSha1(byte[] key) {
296    return hmacSha1(new SecretKeySpec(checkNotNull(key), "HmacSHA1"));
297  }
298
299  /**
300   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
301   * SHA-256 (256 hash bits) hash function and the given secret key.
302   *
303   *
304   * @param key the secret key
305   * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
306   * @since 20.0
307   */
308  public static HashFunction hmacSha256(Key key) {
309    return new MacHashFunction("HmacSHA256", key, hmacToString("hmacSha256", key));
310  }
311
312  /**
313   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
314   * SHA-256 (256 hash bits) hash function and a {@link SecretSpecKey} created from the given byte
315   * array and the SHA-256 algorithm.
316   *
317   *
318   * @param key the key material of the secret key
319   * @since 20.0
320   */
321  public static HashFunction hmacSha256(byte[] key) {
322    return hmacSha256(new SecretKeySpec(checkNotNull(key), "HmacSHA256"));
323  }
324
325  /**
326   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
327   * SHA-512 (512 hash bits) hash function and the given secret key.
328   *
329   *
330   * @param key the secret key
331   * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
332   * @since 20.0
333   */
334  public static HashFunction hmacSha512(Key key) {
335    return new MacHashFunction("HmacSHA512", key, hmacToString("hmacSha512", key));
336  }
337
338  /**
339   * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
340   * SHA-512 (512 hash bits) hash function and a {@link SecretSpecKey} created from the given byte
341   * array and the SHA-512 algorithm.
342   *
343   *
344   * @param key the key material of the secret key
345   * @since 20.0
346   */
347  public static HashFunction hmacSha512(byte[] key) {
348    return hmacSha512(new SecretKeySpec(checkNotNull(key), "HmacSHA512"));
349  }
350
351  private static String hmacToString(String methodName, Key key) {
352    return String.format(
353        "Hashing.%s(Key[algorithm=%s, format=%s])",
354        methodName,
355        key.getAlgorithm(),
356        key.getFormat());
357  }
358
359  /**
360   * Returns a hash function implementing the CRC32C checksum algorithm (32 hash bits) as described
361   * by RFC 3720, Section 12.1.
362   *
363   * @since 18.0
364   */
365  public static HashFunction crc32c() {
366    return Crc32cHolder.CRC_32_C;
367  }
368
369  private static final class Crc32cHolder {
370    static final HashFunction CRC_32_C = new Crc32cHashFunction();
371  }
372
373  /**
374   * Returns a hash function implementing the CRC-32 checksum algorithm (32 hash bits) by delegating
375   * to the {@link CRC32} {@link Checksum}.
376   *
377   * <p>To get the {@code long} value equivalent to {@link Checksum#getValue()} for a
378   * {@code HashCode} produced by this function, use {@link HashCode#padToLong()}.
379   *
380   * @since 14.0
381   */
382  public static HashFunction crc32() {
383    return Crc32Holder.CRC_32;
384  }
385
386  private static class Crc32Holder {
387    static final HashFunction CRC_32 = checksumHashFunction(ChecksumType.CRC_32, "Hashing.crc32()");
388  }
389
390  /**
391   * Returns a hash function implementing the Adler-32 checksum algorithm (32 hash bits) by
392   * delegating to the {@link Adler32} {@link Checksum}.
393   *
394   * <p>To get the {@code long} value equivalent to {@link Checksum#getValue()} for a
395   * {@code HashCode} produced by this function, use {@link HashCode#padToLong()}.
396   *
397   * @since 14.0
398   */
399  public static HashFunction adler32() {
400    return Adler32Holder.ADLER_32;
401  }
402
403  private static class Adler32Holder {
404    static final HashFunction ADLER_32 =
405        checksumHashFunction(ChecksumType.ADLER_32, "Hashing.adler32()");
406  }
407
408  private static HashFunction checksumHashFunction(ChecksumType type, String toString) {
409    return new ChecksumHashFunction(type, type.bits, toString);
410  }
411
412  enum ChecksumType implements Supplier<Checksum> {
413    CRC_32(32) {
414      @Override
415      public Checksum get() {
416        return new CRC32();
417      }
418    },
419    ADLER_32(32) {
420      @Override
421      public Checksum get() {
422        return new Adler32();
423      }
424    };
425
426    private final int bits;
427
428    ChecksumType(int bits) {
429      this.bits = bits;
430    }
431
432    @Override
433    public abstract Checksum get();
434  }
435
436  /**
437   * Returns a hash function implementing FarmHash's Fingerprint64, an open-source algorithm.
438   *
439   * <p>This is designed for generating persistent fingerprints of strings. It isn't
440   * cryptographically secure, but it produces a high-quality hash with fewer collisions than some
441   * alternatives we've used in the past. FarmHashFingerprints generated using this are byte-wise
442   * identical to those created using the C++ version, but note that this uses unsigned integers
443   * (see {@link com.google.common.primitives.UnsignedInts}). Comparisons between the two should
444   * take this into account.
445   *
446   * @since 20.0
447   */
448  public static HashFunction farmHashFingerprint64() {
449    return FarmHashFingerprint64Holder.FARMHASH_FINGERPRINT_64;
450  }
451
452  private static class FarmHashFingerprint64Holder {
453    static final HashFunction FARMHASH_FINGERPRINT_64 = new FarmHashFingerprint64();
454  }
455
456  /**
457   * Assigns to {@code hashCode} a "bucket" in the range {@code [0, buckets)}, in a uniform manner
458   * that minimizes the need for remapping as {@code buckets} grows. That is, {@code
459   * consistentHash(h, n)} equals:
460   *
461   * <ul>
462   * <li>{@code n - 1}, with approximate probability {@code 1/n}
463   * <li>{@code consistentHash(h, n - 1)}, otherwise (probability {@code 1 - 1/n})
464   * </ul>
465   *
466   * <p>This method is suitable for the common use case of dividing work among buckets that meet the
467   * following conditions:
468   *
469   * <ul>
470   * <li>You want to assign the same fraction of inputs to each bucket.
471   * <li>When you reduce the number of buckets, you can accept that the most recently added buckets
472   * will be removed first. More concretely, if you are dividing traffic among tasks, you can
473   * decrease the number of tasks from 15 and 10, killing off the final 5 tasks, and {@code
474   * consistentHash} will handle it. If, however, you are dividing traffic among servers {@code
475   * alpha}, {@code bravo}, and {@code charlie} and you occasionally need to take each of the
476   * servers offline, {@code consistentHash} will be a poor fit: It provides no way for you to
477   * specify which of the three buckets is disappearing. Thus, if your buckets change from {@code
478   * [alpha, bravo, charlie]} to {@code [bravo, charlie]}, it will assign all the old {@code alpha}
479   * traffic to {@code bravo} and all the old {@code bravo} traffic to {@code charlie}, rather than
480   * letting {@code bravo} keep its traffic.
481   * </ul>
482   *
483   *
484   * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
485   * consistent hashing</a> for more information.
486   */
487  public static int consistentHash(HashCode hashCode, int buckets) {
488    return consistentHash(hashCode.padToLong(), buckets);
489  }
490
491  /**
492   * Assigns to {@code input} a "bucket" in the range {@code [0, buckets)}, in a uniform manner that
493   * minimizes the need for remapping as {@code buckets} grows. That is, {@code consistentHash(h,
494   * n)} equals:
495   *
496   * <ul>
497   * <li>{@code n - 1}, with approximate probability {@code 1/n}
498   * <li>{@code consistentHash(h, n - 1)}, otherwise (probability {@code 1 - 1/n})
499   * </ul>
500   *
501   * <p>This method is suitable for the common use case of dividing work among buckets that meet the
502   * following conditions:
503   *
504   * <ul>
505   * <li>You want to assign the same fraction of inputs to each bucket.
506   * <li>When you reduce the number of buckets, you can accept that the most recently added buckets
507   * will be removed first. More concretely, if you are dividing traffic among tasks, you can
508   * decrease the number of tasks from 15 and 10, killing off the final 5 tasks, and {@code
509   * consistentHash} will handle it. If, however, you are dividing traffic among servers {@code
510   * alpha}, {@code bravo}, and {@code charlie} and you occasionally need to take each of the
511   * servers offline, {@code consistentHash} will be a poor fit: It provides no way for you to
512   * specify which of the three buckets is disappearing. Thus, if your buckets change from {@code
513   * [alpha, bravo, charlie]} to {@code [bravo, charlie]}, it will assign all the old {@code alpha}
514   * traffic to {@code bravo} and all the old {@code bravo} traffic to {@code charlie}, rather than
515   * letting {@code bravo} keep its traffic.
516   * </ul>
517   *
518   *
519   * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
520   * consistent hashing</a> for more information.
521   */
522  public static int consistentHash(long input, int buckets) {
523    checkArgument(buckets > 0, "buckets must be positive: %s", buckets);
524    LinearCongruentialGenerator generator = new LinearCongruentialGenerator(input);
525    int candidate = 0;
526    int next;
527
528    // Jump from bucket to bucket until we go out of range
529    while (true) {
530      next = (int) ((candidate + 1) / generator.nextDouble());
531      if (next >= 0 && next < buckets) {
532        candidate = next;
533      } else {
534        return candidate;
535      }
536    }
537  }
538
539  /**
540   * Returns a hash code, having the same bit length as each of the input hash codes, that combines
541   * the information of these hash codes in an ordered fashion. That is, whenever two equal hash
542   * codes are produced by two calls to this method, it is <i>as likely as possible</i> that each
543   * was computed from the <i>same</i> input hash codes in the <i>same</i> order.
544   *
545   * @throws IllegalArgumentException if {@code hashCodes} is empty, or the hash codes do not all
546   *     have the same bit length
547   */
548  public static HashCode combineOrdered(Iterable<HashCode> hashCodes) {
549    Iterator<HashCode> iterator = hashCodes.iterator();
550    checkArgument(iterator.hasNext(), "Must be at least 1 hash code to combine.");
551    int bits = iterator.next().bits();
552    byte[] resultBytes = new byte[bits / 8];
553    for (HashCode hashCode : hashCodes) {
554      byte[] nextBytes = hashCode.asBytes();
555      checkArgument(
556          nextBytes.length == resultBytes.length, "All hashcodes must have the same bit length.");
557      for (int i = 0; i < nextBytes.length; i++) {
558        resultBytes[i] = (byte) (resultBytes[i] * 37 ^ nextBytes[i]);
559      }
560    }
561    return HashCode.fromBytesNoCopy(resultBytes);
562  }
563
564  /**
565   * Returns a hash code, having the same bit length as each of the input hash codes, that combines
566   * the information of these hash codes in an unordered fashion. That is, whenever two equal hash
567   * codes are produced by two calls to this method, it is <i>as likely as possible</i> that each
568   * was computed from the <i>same</i> input hash codes in <i>some</i> order.
569   *
570   * @throws IllegalArgumentException if {@code hashCodes} is empty, or the hash codes do not all
571   *     have the same bit length
572   */
573  public static HashCode combineUnordered(Iterable<HashCode> hashCodes) {
574    Iterator<HashCode> iterator = hashCodes.iterator();
575    checkArgument(iterator.hasNext(), "Must be at least 1 hash code to combine.");
576    byte[] resultBytes = new byte[iterator.next().bits() / 8];
577    for (HashCode hashCode : hashCodes) {
578      byte[] nextBytes = hashCode.asBytes();
579      checkArgument(
580          nextBytes.length == resultBytes.length, "All hashcodes must have the same bit length.");
581      for (int i = 0; i < nextBytes.length; i++) {
582        resultBytes[i] += nextBytes[i];
583      }
584    }
585    return HashCode.fromBytesNoCopy(resultBytes);
586  }
587
588  /**
589   * Checks that the passed argument is positive, and ceils it to a multiple of 32.
590   */
591  static int checkPositiveAndMakeMultipleOf32(int bits) {
592    checkArgument(bits > 0, "Number of bits must be positive");
593    return (bits + 31) & ~31;
594  }
595
596  /**
597   * Returns a hash function which computes its hash code by concatenating the hash codes of the
598   * underlying hash functions together. This can be useful if you need to generate hash codes of a
599   * specific length.
600   *
601   * <p>For example, if you need 1024-bit hash codes, you could join two {@link Hashing#sha512} hash
602   * functions together: {@code Hashing.concatenating(Hashing.sha512(), Hashing.sha512())}.
603   *
604   * @since 19.0
605   */
606  public static HashFunction concatenating(
607      HashFunction first, HashFunction second, HashFunction... rest) {
608    // We can't use Lists.asList() here because there's no hash->collect dependency
609    List<HashFunction> list = new ArrayList<HashFunction>();
610    list.add(first);
611    list.add(second);
612    for (HashFunction hashFunc : rest) {
613      list.add(hashFunc);
614    }
615    return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
616  }
617
618  /**
619   * Returns a hash function which computes its hash code by concatenating the hash codes of the
620   * underlying hash functions together. This can be useful if you need to generate hash codes of a
621   * specific length.
622   *
623   * <p>For example, if you need 1024-bit hash codes, you could join two {@link Hashing#sha512} hash
624   * functions together: {@code Hashing.concatenating(Hashing.sha512(), Hashing.sha512())}.
625   *
626   * @since 19.0
627   */
628  public static HashFunction concatenating(Iterable<HashFunction> hashFunctions) {
629    checkNotNull(hashFunctions);
630    // We can't use Iterables.toArray() here because there's no hash->collect dependency
631    List<HashFunction> list = new ArrayList<HashFunction>();
632    for (HashFunction hashFunction : hashFunctions) {
633      list.add(hashFunction);
634    }
635    checkArgument(list.size() > 0, "number of hash functions (%s) must be > 0", list.size());
636    return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
637  }
638
639  private static final class ConcatenatedHashFunction extends AbstractCompositeHashFunction {
640    private final int bits;
641
642    private ConcatenatedHashFunction(HashFunction... functions) {
643      super(functions);
644      int bitSum = 0;
645      for (HashFunction function : functions) {
646        bitSum += function.bits();
647        checkArgument(
648            function.bits() % 8 == 0,
649            "the number of bits (%s) in hashFunction (%s) must be divisible by 8",
650            function.bits(),
651            function);
652      }
653      this.bits = bitSum;
654    }
655
656    @Override
657    HashCode makeHash(Hasher[] hashers) {
658      byte[] bytes = new byte[bits / 8];
659      int i = 0;
660      for (Hasher hasher : hashers) {
661        HashCode newHash = hasher.hash();
662        i += newHash.writeBytesTo(bytes, i, newHash.bits() / 8);
663      }
664      return HashCode.fromBytesNoCopy(bytes);
665    }
666
667    @Override
668    public int bits() {
669      return bits;
670    }
671
672    @Override
673    public boolean equals(@Nullable Object object) {
674      if (object instanceof ConcatenatedHashFunction) {
675        ConcatenatedHashFunction other = (ConcatenatedHashFunction) object;
676        return Arrays.equals(functions, other.functions);
677      }
678      return false;
679    }
680
681    @Override
682    public int hashCode() {
683      return Arrays.hashCode(functions) * 31 + bits;
684    }
685  }
686
687  /**
688   * Linear CongruentialGenerator to use for consistent hashing. See
689   * http://en.wikipedia.org/wiki/Linear_congruential_generator
690   */
691  private static final class LinearCongruentialGenerator {
692    private long state;
693
694    public LinearCongruentialGenerator(long seed) {
695      this.state = seed;
696    }
697
698    public double nextDouble() {
699      state = 2862933555777941757L * state + 1;
700      return ((double) ((int) (state >>> 33) + 1)) / (0x1.0p31);
701    }
702  }
703
704  private Hashing() {}
705}