Как сгенерировать HashCode для вызова Hashing#consistentHash из google/guava?


person hengxin    schedule 31.12.2015    source источник


Ответы (2)


Используйте еще один HashFunction для хеширования строки и столбца, например.

HashCode h = Hashing.murmur3_32().newHasher()
  .putString(row.getString(), StandardCharsets.UTF_8)
  .putString(col.getString(), StandardCharsets.UTF_8)
  .hash()
person Louis Wasserman    schedule 31.12.2015

Вам нужно каким-то образом сгенерировать хэш ваших объектов строки и столбца, вы можете сделать это, сериализовав их данные и используя одну из хэш-функций из класса Hashing, или вы можете использовать более быструю реализацию хэша и построить HashCode с одним из фабричные методы fromInt, fromLong, fromBytes или fromString.

Вы можете просто использовать IDE для создания метода Java hashCode для ваших объектов, а затем использовать метод HashCode.fromInt() factory для создания объекта Google HashCode.
Это будет намного быстрее, чем сериализация строки и использование криптографического хэша.
Какой бы вариант вы ни выбрали, вам нужно убедиться, что созданный вами хэш-код будет таким же, когда объект содержит одни и те же данные.
Например, хеширование результата метода toString не будет работать, если только вы не переопределяете метод и предоставление текстового представления всех данных ваших объектов. Если вы не переопределите его, вы просто получите идентификатор объекта, который всегда будет отличаться для каждого экземпляра, что по умолчанию будет использоваться для «согласованного» хеширования.

person Magnus    schedule 31.12.2015
comment
Вы могли бы сделать это, но тогда какой смысл вообще заниматься хешированием? Hashing предоставляет множество быстрых хеш-функций, не связанных с криптографией. - person Louis Wasserman; 31.12.2015
comment
@LouisWasserman Row (или Column) заменил hashCode(). Должен ли я использовать его повторно? Что-то вроде HashCode.fromInt(row.hashCode())? - person hengxin; 31.12.2015
comment
@LouisWasserman Не могли бы вы пояснить свое возражение? Я не уверен, с чем вы не согласны. - person Magnus; 31.12.2015
comment
Хеш-функции Guava, как правило, намного лучше справляются с хешированием, не снижая производительность значительным фактором. Если ваши ключи представляют собой простые строки, вы тоже можете это сделать. - person Louis Wasserman; 31.12.2015
comment
@LouisWasserman в моих тестах с использованием goodfasthash это было более чем на порядок медленнее, чем просто использование строкового хэш-кода. Adler32 был примерно таким же, а crc32 примерно в 5 раз медленнее. pastebin.com/kDzBHNFa - person Magnus; 31.12.2015