Java 使用hashCode唯一地表示字符串

Java 使用hashCode唯一地表示字符串,java,hashcode,apache-zookeeper,Java,Hashcode,Apache Zookeeper,我正在尝试创建一个zookeeper节点,使用unix路径作为值(如/x/home/rrs/data0),但这是不允许的 所以我想生成路径的哈希代码,然后用它创建一个节点。 但是我读了以下关于hashcode的内容: 散列不应在分布式应用程序中使用 可能存在冲突,例如,字符串“Aa”和“BB”产生相同的hashCode:2112 我是否应该继续使用哈希代码,或者对于我的用例我还有什么其他选择 另外,如果我一直保持字符串不变,是否保证每次都生成相同的哈希代码?是的,相同的字符串将始终生成相同的

我正在尝试创建一个zookeeper节点,使用unix路径作为值(如
/x/home/rrs/data0
),但这是不允许的

所以我想生成路径的哈希代码,然后用它创建一个节点。 但是我读了以下关于hashcode的内容:

  • 散列不应在分布式应用程序中使用
  • 可能存在冲突,例如,字符串“Aa”和“BB”产生相同的hashCode:2112
我是否应该继续使用哈希代码,或者对于我的用例我还有什么其他选择


另外,如果我一直保持字符串不变,是否保证每次都生成相同的哈希代码?

是的,相同的字符串将始终生成相同的哈希代码

哈希代码确实会发生冲突,相似(但不同)字符串发生冲突的可能性非常小(这是一般的想法)。应用程序应该能够从冲突中恢复(至少不会中断)


弦的性质是什么?它们只是信件吗?最大长度?这些属性可用于生成更好的哈希代码。我所知道的最好的技术之一是Zobrist键。根据字符串的性质,这可能是一个选项。

这取决于您尝试执行的操作

但你是对的:Java哈希代码并不是设计成无冲突的

如果需要某种唯一标识符,可以在字符串上使用加密哈希函数(如SHA-256、MD5等)

如果字符串中的某些字符有问题,只需将其替换为下划线即可

根据Zookeeper是/做什么,hashCode可能根本不是问题。EHCache使用它,对于分布式哈希表来说,它非常好


这是一个很小的问题,但是字符串的hashCode确实总是为同一个字符串生成相同的hash代码。这是因为它是记录在案的,因此无法更改。(但请注意:这不包括unicode中可能出现的同一字符串的不同表示形式。但我认为这不是问题。)

'字符串“Aa”和“BB”产生相同的哈希代码:2112'如何产生?我不知道Zookeeper。为什么不允许?我只是举个例子。ZooKeeper以路径的形式表示节点,这就是为什么它不允许值为的新节点path@rrs120486作为一种可能的解决方案,是否可以将“/”字符替换为Zookeeper允许的字符?可能是破折号或下划线?我使用的字符串是文件的规范路径,如(/x/home/rrs/data0)。最大长度不会超过1024个字符。加密哈希不能防止冲突,尽管它们可能会限制冲突发生的方式和时间。@蒂姆:理论上不会。实际上是这样。确实,这是他们的主要目的。不是为了32位哈希,他们不会,加密哈希使用更高的位数。@Tim:因此我没有写关于32位哈希的东西(sha-256显然不是一个)。事实上,我会说(不知道它的用途)期望整数作为散列的接口必须本质上是冲突安全的。(显然,其他用途支持较大的散列,但在Java中的大多数情况下,当您说散列是指32位)。