为什么java字符串哈希代码在不同但相似的geohash字符串上有许多冲突?

为什么java字符串哈希代码在不同但相似的geohash字符串上有许多冲突?,java,hashcode,geohashing,Java,Hashcode,Geohashing,Geohash字符串是我的稀疏逻辑回归模型中的一个特性。所以我使用java字符串hashCode在geohash字符串上生成int值以获取特征id。但我发现hashCode方法在类似的geohash字符串上的性能很差。这会导致不同的特征具有相同的特征id,即使特征相似,也可能不利于模型优化。 例如,那些相似的geohash字符串对具有相同的hashCode <"wws8vw", "wws8x9"> "wws8vw".hashCode() = -774715770 "w

Geohash字符串是我的稀疏逻辑回归模型中的一个特性。所以我使用java字符串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

“wws8vw”.hashCode()=-774715770
“wws8x9”.hashCode()=-774715770
“wmxy0”.hashCode()=113265337
“wmxwn”.hashCode()=113265337

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

我认为您误解了该方法的目的-不是一般的哈希,而是Java对象使用此方法的原因:

支持此方法是为了使用哈希表,例如HashMap提供的哈希表

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


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

我认为您误解了该方法的目的-不是一般的哈希,而是Java对象使用此方法的原因:

支持此方法是为了使用哈希表,例如HashMap提供的哈希表

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


答案相当明显:您需要设计自己的哈希方法——或者选择一个预先存在的方法——为您的预期输入提供所需的冲突配置文件。
String.hashCode()
所使用的字符串不能由您更改。

为什么?因为这就是
String.hashCode
的实现方式,并且它通常适用于字符串。现在又有一个为什么的问题:你为什么在乎?您遇到了什么问题?这些是什么类型的对象?如果将它们视为
字符串
s,则hashCode是不同的。@DaDaDom我认为OP的意思是
“wws8vw”。hashCode()==“wws8x9”。hashCode()
等。请参阅。哦,好的。我认为这对情侣本身是相配的。嗯,我同意你的第一个评论:看起来@formath试图解决错误的问题。@formath你能说说你为什么关心这些碰撞吗?为什么?因为这就是
String.hashCode
的实现方式,并且它通常适用于字符串。现在又有一个为什么的问题:你为什么在乎?您遇到了什么问题?这些是什么类型的对象?如果将它们视为
字符串
s,则hashCode是不同的。@DaDaDom我认为OP的意思是
“wws8vw”。hashCode()==“wws8x9”。hashCode()
等。请参阅。哦,好的。我认为这对情侣本身是相配的。好的,我同意你的第一个评论:看起来@formath试图解决错误的问题。@formath你能说说你为什么关心这些冲突吗?另外:我会尝试理解geohash值所涵盖的字符串的“子空间”,例如,只有长度为5的字符串,只有a-z0-9作为字符。然后您可以设计一个更好的到int32的映射。@JFMeier这就是我所说的“用于您预期的输入”。但是是的。@AndyTurner“您需要设计自己的哈希方法,或者选择一个预先存在的方法”。你有什么建议吗?@formath我没有(说真的,我不只是迟钝)。你需要做些调查。不过,作为一个想法,为什么要将geohash扩展到其编码的纬度/经度,并将它们散列在一起:
double lat=。。。;双液化天然气=。。。;int hash=Objects.hash(lat,lng)。作为补充:我将尝试理解geohash值所涵盖的字符串的“子空间”,例如,仅长度为5且仅a-z0-9作为字符的字符串。然后您可以设计一个更好的到int32的映射。@JFMeier这就是我所说的“用于您预期的输入”。但是是的。@AndyTurner“您需要设计自己的哈希方法,或者选择一个预先存在的方法”。你有什么建议吗?@formath我没有(说真的,我不只是迟钝)。你需要做些调查。不过,作为一个想法,为什么要将geohash扩展到其编码的纬度/经度,并将它们散列在一起:
double lat=。。。;双液化天然气=。。。;int hash=Objects.hash(lat,lng)