【发布时间】:2020-03-20 14:20:18
【问题描述】:
只是想讨论和理解以下代码之间的区别。
一个>
SortedSet<String> set = new TreeSet<>();
set.addAll(str);
int hashcode= set.toString().hashCode();
b>
SortedSet<String> set = new TreeSet<>();
set.addAll(str);
int hashcode = set.hashCode();
我已经检查了如果您将相同的字符串元素以任何顺序放入两个集合中,哈希码返回值将是相同的。只是想知道条件 a> 比
【问题讨论】:
-
不同之处在于,您在集合上直接请求
hashCode,而不是在它的字符串表示上请求。如果您碰巧得到相同的值,这纯属巧合,并且可以并且将会随着任何 Java 更新而改变。集合的字符串表示可能会改变。 String 的 hashCode 实现可能会改变。 TreeSet 的 hashCode 实现可能会改变。如果其中任何一个发生变化,那么两者之间的哈希值肯定会有所不同。 -
在这种情况下,您所说的“安全”是什么意思?防范什么?
-
这里的哈希码不是加密哈希。但是,是的,如果不知道威胁是什么,就不能谈论安全。
-
@Zabuzza
String和Set已定义。 (虽然在 1.00 中String确实有一个不可能的定义,但从 1.1 开始应该保持不变。) -
如果替换了加密散列(这是担心的角度),则
toString方法不会生成安全散列,因为分隔符可能出现在元素字符串中。字符串化键是漏洞的常见原因。