英文:
String Hashed in both Kotlin and Golang
问题
在服务A中,我有一个字符串,它的哈希值计算如下:
fun String.toHash(): Long {
var hashCode = this.hashCode().toLong()
if (hashCode < 0L) {
hashCode *= -1
}
return hashCode
}
我想在使用Golang编写的服务B中复制这段代码,以便对于相同的单词,我可以得到完全相同的哈希值。根据我对Kotlin文档的理解,应用的哈希函数返回一个64位整数。所以在Go中,我这样做:
func hash(s string) int64 {
h := fnv.New64()
h.Write([]byte(s))
v := h.Sum64()
return int64(v)
}
但是,在对此进行单元测试时,我得不到相同的值。我得到的结果是:
func Test_hash(t *testing.T) {
tests := []struct {
input string
output int64
}{
{input: "papafritas", output: 1079370635},
}
for _, test := range tests {
got := hash(test.input)
assert.Equal(t, test.output, got)
}
}
结果是:
7841672725449611742
我做错了什么吗?
英文:
In service A I have a string that get hashed like this:
fun String.toHash(): Long {
var hashCode = this.hashCode().toLong()
if (hashCode < 0L) {
hashCode *= -1
}
return hashCode
}
I want to replicate this code in service B written in Golang so for the same word I get the exact same hash. For what I understand from Kotlin's documentation the hash applied returns a 64bit integer. So in Go I am doing this:
func hash(s string) int64 {
h := fnv.New64()
h.Write([]byte(s))
v := h.Sum64()
return int64(v)
}
But while unit testing this I do not get the same value. I get:
func Test_hash(t *testing.T) {
tests := []struct {
input string
output int64
}{
{input: "papafritas", output: 1079370635},
}
for _, test := range tests {
got := hash(test.input)
assert.Equal(t, test.output, got)
}
}
Result:
7841672725449611742
Am I doing something wrong?
答案1
得分: 3
Java和因此Kotlin使用的哈希函数与Go不同。
可能的选项有:
- 使用标准的哈希函数。
- 在Go中重新实现Java字符串的hashCode函数。
英文:
Java and therefore Kotlin uses different hash function than Go.
Possible options are:
- Use a standard hash function.
- Reimplement Java hashCode for Strings in Go.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论