根据给定的数字数组创建一个几乎唯一的标识符

Hug*_*nto 4 java arrays algorithm math

给定一组数字,我想创建一个数字标识符,表示该组合尽可能唯一.

例如:

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

输出:

4532464234
Run Code Online (Sandbox Code Playgroud)

- 返回的号码必须尽可能唯一

- 元素的排序必须影响结果

- 算法必须始终从同一输入数组返回相同的结果

- 算法必须尽可能快地在'for'循环中使用

该算法的目的是创建一个存储在DB中的小值,并且易于比较.这并不重要,所以一些数字数组返回相同的值是可以接受的,但这种情况必须是罕见的.

你能建议一个很好的方法来实现这个目标吗?

Ste*_*n C 7

标准(Java 7)实现Arrays.hashCode(int[])具有所需的属性.因此实施:

 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       }
Run Code Online (Sandbox Code Playgroud)

如您所见,实现很快,结果取决于元素的顺序以及元素值.


如果要求所有Java平台上的哈希值都相同,我认为您可以依赖于满意度.javadoc表示该方法将返回一个与调用List<Integer>.hashcode()等效列表时相同的值.而对于哈希码公式指定.