Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashcode()是从信息列表中计算唯一令牌的好方法吗?_Java - Fatal编程技术网

Java hashcode()是从信息列表中计算唯一令牌的好方法吗?

Java hashcode()是从信息列表中计算唯一令牌的好方法吗?,java,Java,我有一个 HashMap<String,AnObject> 将密钥分配给以下对象是否正确: String.valueOf(o.name.hashcode()+o.surname.hashcode()); ??或者有更好的方法从值列表计算字符串哈希代码吗?没有,绝对没有。hashCode不能保证是唯一的 哈希代码的规则很简单: 两个相等的值必须具有相同的哈希代码 理想情况下,两个不相等的值将具有不同的哈希代码,但可以具有相同的哈希代码。特别是,从hashCode返回的可能值只有2

我有一个

HashMap<String,AnObject> 
将密钥分配给以下对象是否正确:

String.valueOf(o.name.hashcode()+o.surname.hashcode());
??或者有更好的方法从值列表计算字符串哈希代码吗?

没有,绝对没有。hashCode不能保证是唯一的

哈希代码的规则很简单:

两个相等的值必须具有相同的哈希代码 理想情况下,两个不相等的值将具有不同的哈希代码,但可以具有相同的哈希代码。特别是,从hashCode返回的可能值只有232个,但可能的字符串超过232个,这使得唯一性变得不可能。 对象的哈希代码不应更改,除非它的某些等式敏感方面发生更改。实际上,使实现值相等的类型不可变通常是一个好主意,至少在对相等敏感的方面是这样。否则,您很容易发现,您无法使用与先前用于密钥的对象引用完全相同的对象引用来查找条目! 散列码是一种优化技术,可以快速找到一组可能与某个目标值相等的候选值,然后通过严格的相等性检查对其进行迭代,以确定其中是否有任何值实际上与目标值相等。这使您能够在基于散列的集合中通过键快速查找某些内容。密钥不是散列本身

如果您需要从两个字符串创建一个键,那么您基本上必须使用某种分隔符从这两个字符串创建键,这样您就可以区分{a,bc}和{ab,c}之间的差异-如果您不小心,分隔符本身可能会出现在值中

有关更多信息,请参阅;这是基于.NET而不是Java的,但它们都适用。同样值得理解的是,hashCode的语义不一定与加密hash的语义相同。特别是,如果您启动了一个新JVM,但创建了一个具有相同字段的对象,那么hashCode的结果可以更改——不应该有人持久化hashCode的结果。像SHA-256这样的东西不是这样的,它对于特定的数据集应该是永久稳定的。

不,顺便说一句,hashCode注意字母C的大小写不能保证唯一性。可以有许多对象生成相同的哈希代码


如果需要唯一标识符,请使用java.util.UUID类。

字符串的哈希代码是有损的;许多字符串值将产生相同的哈希代码。整数有32位位置,每个位置有两个值。即使是32个字符的字符串,也无法在不发生冲突的情况下将每个具有多种可能性的字符映射为32位。它们就是不合身


如果你想使用任意精度的算术运算,比如BigInteger,那么你可以将每个字符作为一个整数,并将它们连接在一起。

如果用于构造键的字段总是唯一的,你就可以了。@Kyte:这根本不是真的。如果你真的想让我…@Kyte,我可以找到具有相同哈希代码的不同字符串的示例,它们是很容易找到的。只需散列2^32个字符串。在现代计算机上散列2^32个短字符串最多需要一个小时,而ie可能要少得多。minutes@Kyte:稀有和从不是一回事。哈希代码根本不是一个合适的键,您声称不同的字符串将导致不同的哈希是不真实的。我们没有任何迹象表明这把钥匙将被用来做什么——想象一下,如果这是一种查找私人信息的方式;使用散列很容易成为一个非常重要的安全漏洞。@Kyte,字符串FB和Ea具有相同的散列代码,并且有更多类似的字符串。所有具有0散列代码的字符串示例:一个额外但非常重要的规则:散列值应是稳定的。程序员经常计算每个内部字段的散列,这可能会导致将对象用作散列映射中的键时出现问题,然后更改一个不重要的字段,然后在散列映射中再也找不到该对象。明智地选择用于计算散列的字段。最终字段是最佳选择。@PeterWalser:它在特定上下文中应该是稳定的。它不需要在进程执行等之间保持稳定。特别是,您不应该存储哈希代码的结果。将在答案中编辑一些内容。
String.valueOf(o.name.hashcode()+o.surname.hashcode());