String Hashed как в Kotlin, так и в Golang

В службе A у меня есть строка, которая хэшируется следующим образом:

fun String.toHash(): Long {
    var hashCode = this.hashCode().toLong()
    if (hashCode < 0L) {
        hashCode *= -1
    }
    return hashCode
}

Я хочу воспроизвести этот код в сервисе B, написанном на Golang, чтобы для того же слова я получил точно такой же хэш. Насколько я понимаю из документации 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

Я делаю что-то неправильно?

Если вы не хотите использовать стандартный хэш, вы можете реализовать java-версию самостоятельно: stackoverflow.com/questions/15518418/…

JimB 06.02.2023 21:34

@JimB Большое спасибо! Это был нужный мне импульс и конструктивный ответ.

Matias Barrios 06.02.2023 22:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Java и, следовательно, Kotlin используют другую хеш-функцию, чем Go.

Возможные варианты:

  1. Используйте стандартную хеш-функцию.
  2. Повторно реализовать хэш-код Java для строк в Go.

Да, я вижу это. Могу ли я как-нибудь воспроизвести путь «Котлина» в Go? Я действительно не хочу ничего менять на сервисе Kotlin.

Matias Barrios 06.02.2023 20:55

Алгоритм хеширования Java/Kotlin не указан в спецификации, не так ли? Так что на него нельзя положиться — он может меняться между реализациями JVM (или даже разными версиями одной и той же JVM). Если вам нужен конкретный алгоритм, я думаю, гораздо безопаснее реализовать его самостоятельно.

gidds 07.02.2023 09:21

@gidds: я не уверен, где java рисует задокументированную строку по сравнению с указанной, но алгоритм задокументирован (но я согласен, что использование стандартизированного хэша имело бы больше смысла)

JimB 07.02.2023 19:09

@JimB А, так это задокументировано! Спасибо за ссылку. (Я не был уверен, отсюда и вопрос :-)  Так что было бы безопасно реализовать его повторно. Хотя я предполагаю, что если вам все равно придется реализовать хэш в Go, вероятно, будет понятнее (и проще отлаживать), если вы выберете свой собственный алгоритм и реализуете его на обоих языках.

gidds 07.02.2023 23:20

Другие вопросы по теме