4

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

例如:

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

输出:

4532464234

- 返回的数字必须尽可能唯一

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

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

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

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

你能提出一个好的方法来完成这个吗?

4

4 回答 4

8

的标准(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       }

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


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

于 2013-09-17T14:20:59.847 回答
2

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

文件

于 2013-09-17T14:16:13.717 回答
1

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

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

另请参阅Java API

于 2013-09-17T14:16:25.763 回答
1

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

我不知道您会在多大程度上依赖第 3 点The algorithm must return always the same result from the same input array,但这取决于 JVM 实现。

因此,根据您的用例,您可能会遇到一些麻烦(然后解决方案是使用外部哈希库)。

有关更多信息,请查看这个 SO 问题:Java, Object.hashCode() result constant across all JVMs/Systems?

编辑

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

编辑2

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

于 2013-09-17T14:21:44.877 回答