code: public static HashFunction concatenating(Iterable<HashFunction> hashFunctions) {
          N.checkArgNotNull(hashFunctions);
          // We can't use Iterables.toArray() here because there's no hash->collect dependency
  
          HashFunction[] a = null;
  
          if (hashFunctions instanceof Collection) {
              final Collection<HashFunction> c = (Collection<HashFunction>) hashFunctions;
              a = c.toArray(new HashFunction[c.size()]);
          } else {
              List<HashFunction> list = new ArrayList<HashFunction>();
  
              for (HashFunction hashFunction : hashFunctions) {
                  list.add(hashFunction);
              }
  
              a = list.toArray(new HashFunction[list.size()]);
          }
  
          N.checkArgument(N.len(a) > 0, "number of hash functions (%s) must be > 0");
  
          return new ConcatenatedHashFunction(a);
      }
docs: Returns a hash function which computes its hash code by concatenating the hash codes of the
  underlying hash functions together. This can be useful if you need to generate hash codes of a
  specific length.
  
  <p>For example, if you need 1024-bit hash codes, you could join two {@link Hashing#sha512} hash
  functions together: {@code Hashing.concatenating(Hashing.sha512(), Hashing.sha512())}.
  
  @since 19.0