https://kotlinlang.org logo
#russian
Title
# russian
l

lewik

03/18/2019, 6:00 PM
Вопрос команде JB. https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/hash-code.html Any.hashCode() Я могу использовать это для кроссплатформенного сравнения строк?
i

ilya.gorbunov

03/18/2019, 6:07 PM
Если между разными платформами, то не стоит. Мы не специфицируем (на данный момент) алгоритм расчета hashCode для строк в котлине. Максимум на что можно полагаться, что одинаковые строки будут иметь одинаковый хеш-код в пределах одного исполнения программы.
l

lewik

03/18/2019, 6:10 PM
Какой есть быстрый способ сравнить строки кроссплатформенно (какой хеш или может что то у вас есть готовое)?
i

ilya.gorbunov

03/18/2019, 6:10 PM
==
,
equals
l

lewik

03/18/2019, 6:10 PM
Строки жирные, я не могу их таскать по сети.
e

elizarov

03/18/2019, 6:19 PM
Например можно так:
Copy code
str.fold(0) { a, c -> a * 31 + c.toInt() }
Так работает String.hashCode в Java. Константы можете поменять по вкусу.
l

lewik

03/18/2019, 6:21 PM
@elizarov Спасибо
А там... 31 по какой то причине вроде было
e

elizarov

03/18/2019, 6:22 PM
Если будете менять множитель, то рекомендуется простое число использовать более 26. (для латинского алфавита)
31 было чтобы на старых процах быстро умножение работало (работает для любого множителя вида 2^N +/- 1)
На современных процах — в целом пофиг
l

lewik

03/18/2019, 6:24 PM
Спасибо
i

ilya.gorbunov

03/18/2019, 10:13 PM
Строки жирные, я не могу их таскать по сети.
Т.е. вместо строк хотите сравнивать их хеши? А что будет если совпадут — ведь непонятно будет, это равные строки или просто хеш-коллизия?
g

ghedeon

03/18/2019, 10:43 PM
Если там какая-то DHT, то хэша хватит, чтобы отправить в нужный бакет и локально разрешить через equals. (вставил две копейки, условия задачи все равно не знаем)
3 Views