Size: a a a

Kotlin Community

2020 August 14

X

X in Kotlin Community
Bogdan Panchenko
Конечно все 😄😊 не помню где было про хешкод, ну по факту там полином, можно просто загуглить как считается хешкод в стринг
да так то я понимал, что коллизии возможны, но просто конкретно в этом месте я не учел, что данные когда-нибудь будут в разном регистре. Но и не знал, что регистр может таким образом влиять на хэшкод. Хабр читаю сейчас об этом
источник

BP

Bogdan Panchenko in Kotlin Community
X
да так то я понимал, что коллизии возможны, но просто конкретно в этом месте я не учел, что данные когда-нибудь будут в разном регистре. Но и не знал, что регистр может таким образом влиять на хэшкод. Хабр читаю сейчас об этом
регистры влияет потому что это разные коды символов
источник

IO

Iaroslav Orlov in Kotlin Community
Ruslan Ibragimov
Более того, правильно написанное приложение будет худо-бедно работать даже с одинаковым хэшкодом для всех объектов. Есть специальный ключик для JVM дажe: -XX:hashCode=2
почему худобедно? просто с жестким оверхедом на все хеш-коллекции.
источник

IO

Iaroslav Orlov in Kotlin Community
и то, в большинстве случаев он переопределен
источник

RI

Ruslan Ibragimov in Kotlin Community
Iaroslav Orlov
почему худобедно? просто с жестким оверхедом на все хеш-коллекции.
Ну например потому что в ответе сервера будет не O(1), а O(N) 🙂
источник

RI

Ruslan Ibragimov in Kotlin Community
Если там какой-то кеш был с сессиями например
источник

IO

Iaroslav Orlov in Kotlin Community
Ruslan Ibragimov
Если там какой-то кеш был с сессиями например
а, вот в кешах и пулах я плохо разбираюсь, так что возможно
источник

AS

Andrei Shikov in Kotlin Community
Iaroslav Orlov
почему худобедно? просто с жестким оверхедом на все хеш-коллекции.
ну это и будет худо-бедно 🙂
источник

VP

Vladimir Petrakovich in Kotlin Community
X
есть, потому как эти строки делаются не из одной, а из нескольких. То есть есть не something, а something + another + different. И это место вызывается много раз в секунду, так что строки соединять дело неблагодарное, проще по хэшкоду или как-то иначе
Тогда это не строка, а data class с тремя полями, не?
источник

X

X in Kotlin Community
Vladimir Petrakovich
Тогда это не строка, а data class с тремя полями, не?
дата класс с десятками строк, из дата класса нужно сделать ключ для хэшмап. Ключ будет уникальным только при конкатенации трех строк из класса. Поэтому сейчас тупо приплюсовываю строки вместо хэшкода, чтобы уберечь от возможной коллизии даже при верхнем регистре строк. Это вопрос времени, когда коллизия проявит себя. А вот с прибавлением строк чуть просядет эффективность кода, но хоть надежно будет
источник

VP

Vladimir Petrakovich in Kotlin Community
X
дата класс с десятками строк, из дата класса нужно сделать ключ для хэшмап. Ключ будет уникальным только при конкатенации трех строк из класса. Поэтому сейчас тупо приплюсовываю строки вместо хэшкода, чтобы уберечь от возможной коллизии даже при верхнем регистре строк. Это вопрос времени, когда коллизия проявит себя. А вот с прибавлением строк чуть просядет эффективность кода, но хоть надежно будет
Так вы запихивайте этот класс (с переопределённым хэш-кодом) как ключ в мапу. Чем это хуже конкатенации?
источник

X

X in Kotlin Community
Vladimir Petrakovich
Так вы запихивайте этот класс (с переопределённым хэш-кодом) как ключ в мапу. Чем это хуже конкатенации?
я так не делаю, так нельзя сделать в принципе, потому что хэшмапа хранит изначальные хэши объектов,  а после изменения объекта хэш поменяется, но не в хэшмапе
источник

X

X in Kotlin Community
я просто создаю ключ на основе данных из объекта. Ключом является строка
источник

VP

Vladimir Petrakovich in Kotlin Community
X
я так не делаю, так нельзя сделать в принципе, потому что хэшмапа хранит изначальные хэши объектов,  а после изменения объекта хэш поменяется, но не в хэшмапе
Не очень понимаю, почему он не иммутабельный
источник

VP

Vladimir Petrakovich in Kotlin Community
X
я просто создаю ключ на основе данных из объекта. Ключом является строка
Так сделайте отдельный иммутабельный класс под этот ключ, который будет содержать именно те поля, которые участвуют в ключе, т.е. те строки, которые вы конкатенировали
источник

X

X in Kotlin Community
Vladimir Petrakovich
Не очень понимаю, почему он не иммутабельный
есть уже такой класс, используется в другом месте. Хотел как-то на хэшкодах убрать необходимость создавать объект каждый раз. Дооптимизировался, называется.
источник

AS

Andrei Shikov in Kotlin Community
X
есть уже такой класс, используется в другом месте. Хотел как-то на хэшкодах убрать необходимость создавать объект каждый раз. Дооптимизировался, называется.
вообще отдельный класс намного дешевле делать, чем строки складывать лишний раз 🙂
источник

X

X in Kotlin Community
Andrei Shikov
вообще отдельный класс намного дешевле делать, чем строки складывать лишний раз 🙂
так то да, вы правы.
источник

VP

Vladimir Petrakovich in Kotlin Community
X
есть уже такой класс, используется в другом месте. Хотел как-то на хэшкодах убрать необходимость создавать объект каждый раз. Дооптимизировался, называется.
Ну так-то это копейки, редко стоит думать о таком до того, как вы расчехлили профилировщик
источник

VP

Vladimir Petrakovich in Kotlin Community
Особенно, если вы не под андроид пишете
источник