给定一组数字,我想创建一个数字标识符,表示该组合尽可能唯一。
例如:
int[] inputNumbers = { 543, 134, 998 };
int identifier = createIdentifier(inputNumbers);
System.out.println( identifier );
输出:
4532464234
- 返回的号码必须尽可能唯一
- 元素的排序必须影响结果
- 算法必须始终从同一输入数组返回相同的结果
- 算法必须尽可能快地在“for”循环中使用
这种算法的目的是创建一个存储在DB中的小值,并且易于比较。这并不重要,所以一些数字数组返回相同的值是可以接受的,但这种情况必须是罕见的。
你能提出一个很好的方法来实现这个目标吗?
答案 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[])
,它正是这样做的。
答案 2 :(得分:1)
答案 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 在他的回答中所示。