从Java中的int列表生成唯一键

从Java中的int列表生成唯一键,java,list,key,Java,List,Key,我有许多(不可变)的Integer值列表 其中一些包含完全相同的值。所以为了节省内存,我想找到那些。 因此,我使用的是HashMap 一种有效的方法是将值连接到一个大的字符串,并将其用作HashMap中的键 这种方法工作可靠,但速度非常慢,占用大量内存 我的整数值介于1和100000000之间。列表包含的值介于1和1000之间 可能有多达100000000个列表 我需要确保没有冲突。您需要为集合找到一些哈希函数。 我认为这个答案可能会帮助你- 将列表转换为biginger Arrays.hash

我有许多(不可变)的
Integer
值列表

其中一些包含完全相同的值。所以为了节省内存,我想找到那些。 因此,我使用的是
HashMap

一种有效的方法是将值连接到一个大的
字符串
,并将其用作
HashMap
中的键

这种方法工作可靠,但速度非常慢,占用大量内存

我的
整数
值介于1和100000000之间。列表包含的值介于1和1000之间

可能有多达100000000个列表


我需要确保没有冲突。

您需要为集合找到一些哈希函数。 我认为这个答案可能会帮助你-

  • 将列表转换为
    biginger
  • Arrays.hashCode()
    List.hashCode()
    ,视情况而定
  • CRC32
  • 一个SHA256512

尝试使用一套。下面是一个使用Java8的示例。它接受两个列表并创建一个单独的集合,其中仅包含列表1和列表2中的重复条目:

    Integer[] a = {1,2,2,3,1};
    List<Integer> list1 = Arrays.asList(a);
    List<Integer> list2 = Arrays.asList(a);

    Set<Integer> duplicates = list1.stream().filter(entry -> list2.contains(entry)).collect(Collectors.toSet());
Integer[]a={1,2,2,3,1};
List list1=Arrays.asList(a);
List list2=Arrays.asList(a);
Set duplicates=list1.stream().filter(条目->list2.contains(条目)).collect(Collectors.toSet());

假设您有两个列表,一个是
1->2->3
,另一个是
2->1->3
。两者都包含相同的数字,但如果我按顺序将它们连接到一个
字符串
,则不会得到相同的结果。你是如何连接不同的列表的,有什么顺序吗?在我看来,检查是否相等要比有几个重复的列表花费更多的精力。为什么不使用
hashCode
作为映射键呢?@rzysia:因为hashCode不是冲突安全的。不可能计算唯一的短键(例如,一个
int
或一个
long
)用于任意整数列表,因为。如果这是可能的话,你会有一个奇妙的压缩算法-你可以将任意数量的数据压缩成一个小的、固定长度的代码…这显然是不可能的。使用默认的.hashCode()方法不是冲突安全的。您是否有建议如何实现它的冲突安全?否
hashCode()
方法是冲突安全的。有这么多的数据和这么多的范围,你永远也不会让它成为冲突安全的。你必须接受这是一个哈希代码,需要进一步的平等性测试。它仍然会为你节省大量的时间。