【问题标题】:Why java string hashCode has many collisions on different but similar geohash strings?为什么java字符串hashCode在不同但相似的geohash字符串上有很多冲突?
【发布时间】:2016-07-29 07:13:04
【问题描述】:

Geohash 字符串是我的稀疏逻辑回归模型中的一个特征。所以我使用 java string hashCode 在 geohash 字符串上生成 int 值以获得特征 ID。但我发现 hashCode 方法在类似的 geohash 字符串上表现不佳。这会导致不同的特征具有相同的特征 id,即使特征相似,这也可能对模型优化不利。 例如,那些相似的 geohash 字符串对具有相同的 hashCode。

<"wws8vw", "wws8x9">
    "wws8vw".hashCode() = -774715770
    "wws8x9".hashCode() = -774715770
<"wmxy0", "wmxwn">
    "wmxy0".hashCode() = 113265337
    "wmxwn".hashCode() = 113265337

我猜geohash生成器方法和java hashCode方法之间有一些关系。那么,任何人都可以向我解释真正的原因以及如何减少 geohash 字符串上的冲突?

【问题讨论】:

  • 为什么?因为这就是String.hashCode 的实现方式,而且它通常适用于字符串。现在另一个为什么的问题:你为什么在乎?遇到了什么问题?
  • 这些是什么物品?如果取为Strings,则hashCodes不同。
  • @DaDaDom 我认为 OP 的意思是"wws8vw".hashCode() == "wws8x9".hashCode() 等。见this
  • 哦,好的。我认为这对本身是匹配的。好吧,我同意你的第一条评论:看起来@formath 正在尝试解决错误的问题。
  • @formatth 你能说一下为什么你关心这些冲突吗?

标签: java hashcode geohashing


【解决方案1】:

我认为您误解了Object.hashCode() method 的用途——一般不是散列,而是Java 对象具有这种方法的原因:

支持这种方法是为了方便哈希表,例如 HashMap 提供的那些。

因此,如果您尝试将此方法用作机器学习模型的输入,您并没有将其用于预期目的。

答案相当明显:您需要设计自己的散列方法 - 或选择一种预先存在的方法 - 为您的预期输入提供所需的冲突配置文件。 String.hashCode()使用的那个你不能改。

【讨论】:

  • 另外:我会尝试理解您的 geohash 值所涵盖的字符串的“子空间”,例如只有长度为 5 的字符串,只有 a-z0-9 作为字符。然后你可以设计一个更好的映射到 int32。
  • @JFMeier 这就是我所说的“为您的预期输入”。但是是的。
  • @AndyTurner “您需要设计自己的哈希方法 - 或选择一个预先存在的方法”。你有什么建议吗?
  • @formath 我不知道(真的,我不只是迟钝)。你需要做一些研究。不过,就像一个想法一样,为什么要将 geohash 扩展到其编码的纬度/经度,并将它们散列在一起:double lat = ...; double lng = ...; int hash = Objects.hash(lat, lng);.
猜你喜欢
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2013-11-24
  • 2010-10-21
  • 1970-01-01
  • 2019-05-20
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多