All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hpccsystems.ws.client.utils.HashCodeUtil Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2011 HPCC Systems. All rights reserved. This program and the accompanying materials are made available
 * under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors: HPCC Systems - initial API and implementation
 ******************************************************************************/
package org.hpccsystems.ws.client.utils;

import java.lang.reflect.Array;

public final class HashCodeUtil
{

    /**
     * An initial value for a hashCode, to which is added contributions from fields. Using a non-zero value
     * decreases collisons of hashCode values.
     */
    public static final int SEED = 23;

    /**
     * booleans.
     *
     * @param aSeed
     *            the a seed
     * @param aBoolean
     *            the a boolean
     * @return the int
     */
    public static int hash(int aSeed, boolean aBoolean)
    {
        return firstTerm(aSeed) + (aBoolean ? 1 : 0);
    }

    /**
     * chars.
     *
     * @param aSeed
     *            the a seed
     * @param aChar
     *            the a char
     * @return the int
     */
    public static int hash(int aSeed, char aChar)
    {
        return firstTerm(aSeed) + aChar;
    }

    /**
     * ints.
     *
     * @param aSeed
     *            the a seed
     * @param aInt
     *            the a int
     * @return the int
     */
    public static int hash(int aSeed, int aInt)
    {
        /*
         * Implementation Note Note that byte and short are handled by this method, through implicit conversion.
         */
        return firstTerm(aSeed) + aInt;
    }

    /**
     * longs.
     *
     * @param aSeed
     *            the a seed
     * @param aLong
     *            the a long
     * @return the int
     */
    public static int hash(int aSeed, long aLong)
    {
        return firstTerm(aSeed) + (int) (aLong ^ (aLong >>> 32));
    }

    /**
     * floats.
     *
     * @param aSeed
     *            the a seed
     * @param aFloat
     *            the a float
     * @return the int
     */
    public static int hash(int aSeed, float aFloat)
    {
        return hash(aSeed, Float.floatToIntBits(aFloat));
    }

    /**
     * doubles.
     *
     * @param aSeed
     *            the a seed
     * @param aDouble
     *            the a double
     * @return the int
     */
    public static int hash(int aSeed, double aDouble)
    {
        return hash(aSeed, Double.doubleToLongBits(aDouble));
    }

    /**
     * aObject is a possibly-null object field, and possibly an array.
     * 
     * If aObject is an array, then each element may be a primitive or a possibly-null object.
     *
     * @param aSeed
     *            the a seed
     * @param aObject
     *            the a object
     * @return the int
     */
    public static int hash(int aSeed, Object aObject)
    {
        int result = aSeed;
        if (aObject == null)
        {
            result = hash(result, 0);
        }
        else if (!isArray(aObject))
        {
            result = hash(result, aObject.hashCode());
        }
        else
        {
            int length = Array.getLength(aObject);
            for (int idx = 0; idx < length; ++idx)
            {
                Object item = Array.get(aObject, idx);
                // recursive call!
                result = hash(result, item);
            }
        }
        return result;
    }

    // / PRIVATE ///
    private static final int fODD_PRIME_NUMBER = 37;

    /**
     * First term.
     *
     * @param aSeed
     *            the a seed
     * @return the int
     */
    private static int firstTerm(int aSeed)
    {
        return fODD_PRIME_NUMBER * aSeed;
    }

    /**
     * Checks if is array.
     *
     * @param aObject
     *            the a object
     * @return true, if is array
     */
    private static boolean isArray(Object aObject)
    {
        return aObject.getClass().isArray();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy