Hash.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util.hash;
  19. import org.apache.hadoop.conf.Configuration;
  20. /**
  21.  * This class represents a common API for hashing functions.
  22.  */
  23. public abstract class Hash {
  24.   /** Constant to denote invalid hash type. */
  25.   public static final int INVALID_HASH = -1;
  26.   /** Constant to denote {@link JenkinsHash}. */
  27.   public static final int JENKINS_HASH = 0;
  28.   /** Constant to denote {@link MurmurHash}. */
  29.   public static final int MURMUR_HASH  = 1;
  30.   
  31.   /**
  32.    * This utility method converts String representation of hash function name
  33.    * to a symbolic constant. Currently two function types are supported,
  34.    * "jenkins" and "murmur".
  35.    * @param name hash function name
  36.    * @return one of the predefined constants
  37.    */
  38.   public static int parseHashType(String name) {
  39.     if ("jenkins".equalsIgnoreCase(name)) {
  40.       return JENKINS_HASH;
  41.     } else if ("murmur".equalsIgnoreCase(name)) {
  42.       return MURMUR_HASH;
  43.     } else {
  44.       return INVALID_HASH;
  45.     }
  46.   }
  47.   
  48.   /**
  49.    * This utility method converts the name of the configured
  50.    * hash type to a symbolic constant.
  51.    * @param conf configuration
  52.    * @return one of the predefined constants
  53.    */
  54.   public static int getHashType(Configuration conf) {
  55.     String name = conf.get("hadoop.util.hash.type", "murmur");
  56.     return parseHashType(name);
  57.   }
  58.   
  59.   /**
  60.    * Get a singleton instance of hash function of a given type.
  61.    * @param type predefined hash type
  62.    * @return hash function instance, or null if type is invalid
  63.    */
  64.   public static Hash getInstance(int type) {
  65.     switch(type) {
  66.     case JENKINS_HASH:
  67.       return JenkinsHash.getInstance();
  68.     case MURMUR_HASH:
  69.       return MurmurHash.getInstance();
  70.     default:
  71.       return null;
  72.     }
  73.   }
  74.   
  75.   /**
  76.    * Get a singleton instance of hash function of a type
  77.    * defined in the configuration.
  78.    * @param conf current configuration
  79.    * @return defined hash type, or null if type is invalid
  80.    */
  81.   public static Hash getInstance(Configuration conf) {
  82.     int type = getHashType(conf);
  83.     return getInstance(type);
  84.   }
  85.   
  86.   /**
  87.    * Calculate a hash using all bytes from the input argument, and
  88.    * a seed of -1.
  89.    * @param bytes input bytes
  90.    * @return hash value
  91.    */
  92.   public int hash(byte[] bytes) {
  93.     return hash(bytes, bytes.length, -1);
  94.   }
  95.   
  96.   /**
  97.    * Calculate a hash using all bytes from the input argument,
  98.    * and a provided seed value.
  99.    * @param bytes input bytes
  100.    * @param initval seed value
  101.    * @return hash value
  102.    */
  103.   public int hash(byte[] bytes, int initval) {
  104.     return hash(bytes, bytes.length, initval);
  105.   }
  106.   
  107.   /**
  108.    * Calculate a hash using bytes from 0 to <code>length</code>, and
  109.    * the provided seed value
  110.    * @param bytes input bytes
  111.    * @param length length of the valid bytes to consider
  112.    * @param initval seed value
  113.    * @return hash value
  114.    */
  115.   public abstract int hash(byte[] bytes, int length, int initval);
  116. }