Java 字符串对象的哈希为0
场景:有一个消息发送者和一个消息接收者。消息的内容将转换为xom.nu文档并传递给接收方。这里发生了一些有趣的事情。 其中一个标记(即文本)有一种属性语言,其值为字符串en 发送方的en有一个散列值,但接收方的散列值显示为零。是什么导致字符串的哈希为零 发件人: 接收人:Java 字符串对象的哈希为0,java,xml,string,hash,Java,Xml,String,Hash,场景:有一个消息发送者和一个消息接收者。消息的内容将转换为xom.nu文档并传递给接收方。这里发生了一些有趣的事情。 其中一个标记(即文本)有一种属性语言,其值为字符串en 发送方的en有一个散列值,但接收方的散列值显示为零。是什么导致字符串的哈希为零 发件人: 接收人: 您不应该仅通过变量的内部结构来检查变量 在这种情况下,您的问题是字段哈希充当缓存。只有在此实例上调用过hashCode时,它才包含一个值 尝试查看variable.hashCode,您会注意到哈希字段也会发生变化。以下是has
您不应该仅通过变量的内部结构来检查变量 在这种情况下,您的问题是字段哈希充当缓存。只有在此实例上调用过hashCode时,它才包含一个值 尝试查看variable.hashCode,您会注意到哈希字段也会发生变化。以下是hashCode方法的源代码: 您可以看到,只有在第一次调用hashCode时才计算该值。这并不重要,因为hash是私有的:您只能使用hashCode方法正常地获取它
回答您的明确问题:对于空字符串,hashCode返回的字符串哈希值为0,但。这意味着尚未计算哈希值??我认为Suresh是对的,请尝试调用hashCode。此外,不同平台上的哈希代码也不能保证相同。@Marcelo哈希算法在文档中有定义。所以它是独立于平台的。对于空字符串,hashCode值不仅仅是零。
1493 public int hashCode() {
1494 int h = hash;
1495 if (h == 0) {
1496 int off = offset;
1497 char val[] = value;
1498 int len = count;
1499
1500 for (int i = 0; i < len; i++) {
1501 h = 31*h + val[off++];
1502 }
1503 hash = h;
1504 }
1505 return h;
1506 }