org.hpccsystems.ws.client.utils.HashCodeUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of wsclient Show documentation
Show all versions of wsclient Show documentation
This project allows a user to interact with ESP services in a controlled manner. The API calls available under org.hpccsystems.ws.client.platform allow for a user to target ESP's across multiple environments running a range of hpccsystems-platform versions. There is no guarantee that if a user utilizes org.hpccsystems.ws.client.gen generated stub code from wsdl, that the calls will be backwards compatible with older hpccsystems-platform versions.
/*******************************************************************************
* 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();
}
}