    001/*
    002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.util;
    022
    023/**
    024 * Murmur3 is a fast non cryptographic hash algorithm. This class implements the 32bit version of Murmur 3.
    025 * <p/>
    026 * The code has been taken from the guava project:
    027 * https://github.com/google/guava/blob/v18.0/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
    028 */
    029
    030/*
    031* Source:
    032* http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
    033* (Modified to adapt to Guava coding conventions and to use the HashFunction interface)
    034*/
    035public class Murmur3
    036  {
    037  private static final int C1 = 0xcc9e2d51;
    038  private static final int C2 = 0x1b873593;
    039  public static final int SEED = 0x9747b28c;
    040
    041  /**
    042   * Applies murmur3 to the given input.
    043   *
    044   * @param input The int to hash.
    045   * @return a murmur3 hash.
    046   */
    047  public static int hashInt( int input )
    048    {
    049    int k1 = mixK1( input );
    050    int h1 = mixH1( SEED, k1 );
    051    return fmix( h1, 4 );
    052    }
    053
    054  public static int mixK1( int k1 )
    055    {
    056    k1 *= C1;
    057    k1 = Integer.rotateLeft( k1, 15 );
    058    k1 *= C2;
    059    return k1;
    060    }
    061
    062  public static int mixH1( int h1, int k1 )
    063    {
    064    h1 ^= k1;
    065    h1 = Integer.rotateLeft( h1, 13 );
    066    h1 = h1 * 5 + 0xe6546b64;
    067    return h1;
    068    }
    069
    070  // Finalization mix - force all bits of a hash block to avalanche
    071  public static int fmix( int h1, int length )
    072    {
    073    h1 ^= length;
    074    h1 ^= h1 >>> 16;
    075    h1 *= 0x85ebca6b;
    076    h1 ^= h1 >>> 13;
    077    h1 *= 0xc2b2ae35;
    078    h1 ^= h1 >>> 16;
    079    return h1;
    080    }
    081  }