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

时间:2013-09-17 14:08:30

标签: java arrays algorithm math

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

例如:

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

输出:

4532464234

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

 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       }

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


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

答案 1 :(得分:2)

看看Arrays.hashCode(int[]),它正是这样做的。

documentation

答案 2 :(得分:1)

您正在寻找的是数组的哈希码。

int hash = Arrays.hashCode(new int[]{1, 2, 3, 4});

另见the Java API

答案 3 :(得分:1)

我还说你正在寻找某种哈希函数。

我不知道你将依赖第3点The algorithm must return always the same result from the same input array多少,但这取决于JVM的实现。

因此,根据您的使用情况,您可能会遇到一些麻烦(解决方案是使用extern哈希库)。

有关详细信息,请查看此SO问题:Java, Object.hashCode() result constant across all JVMs/Systems?

修改

我刚刚读到你想要将值存储在数据库中。在这种情况下,我建议你使用一个可靠的extern hasing库,并保证每次调用它时都会产生相同的值。否则,每次启动应用程序时都必须重新哈希整个数据库,以使其处于一致状态。

<强> EDIT2

由于您只使用普通int,因此哈希值应该每次都相同。正如 @Stephen C 在他的回答中所示。