使用hashCode唯一地表示字符串

时间:2014-03-27 11:18:31

标签: java hashcode apache-zookeeper

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

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

  • 不应在分布式应用程序中使用哈希。
  • 可能存在冲突,例如,字符串“Aa”和“BB”产生相同的hashCode:2112

我应该继续使用哈希码还是我的用例有哪些其他选项?

此外,如果我一直保持字符串相同,是否保证每次都生成相同的hashCode

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

这取决于你想要做什么。

但你是对的:Java hashCodes并非设计为无冲突。

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

如果您的字符串中的某些字符出现问题,请更换它们,例如用下划线。

取决于Zookeeper是什么/做什么,也许hashCode根本不是问题。 EHCache使用它,它对于分散的哈希表非常好。

它很糟糕,但String的hashCode确实 为同一个字符串始终生成相同的哈希码。这是因为它已记录在案,因此无法更改。 (但请注意:这并不包含相同字符串的不同表示,就像它在unicode中可能一样。但我认为这不是问题。)