Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create an almost unique identifier based on a given array of numbers

Given an array of numbers, I would like to create a number identifier that represents that combination as unique as possible.

For example:

int[] inputNumbers = { 543, 134, 998 };
int identifier = createIdentifier(inputNumbers);
System.out.println( identifier );

Output:

4532464234

-The returned number must be as unique as possible

-Ordering of the elements must influence the result

-The algorithm must return always the same result from the same input array

-The algorithm must be as fast as possible to be used alot in 'for' loops

The purpose of this algorithm, is to create a small value to be stored in a DB, and to be easily comparable. It is nothing critical so it's acceptable that some arrays of numbers return the same value, but that cases must be rare.

Can you suggest a good way to accomplish this?

like image 984
Hugo Pinto Avatar asked Dec 16 '22 06:12

Hugo Pinto


1 Answers

The standard ( Java 7 ) implementation of Arrays.hashCode(int[]) has the required properties. It is implemented thus:

 2938       public static int hashCode(int a[]) {
 2939           if (a == null)
 2940               return 0;
 2941   
 2942           int result = 1;
 2943           for (int element : a)
 2944               result = 31 * result + element;
 2945   
 2946           return result;
 2947       }

As you can see, the implementation is fast, and the result depends on the order of the elements as well as the element values.


If there is a requirement that the hash values are the same across all Java platforms, I think you can rely on that being satisfied. The javadoc says that the method will return a value that is that same as you get when calling List<Integer>.hashcode() on an equivalent list. And the formula for that hashcode is specified.

like image 119
Stephen C Avatar answered Jan 19 '23 00:01

Stephen C