Как глубоко копировать хеш в Java - PullRequest
0 голосов
/ 08 октября 2018

Я хотел бы хэшировать большое количество int[] в Java.Мои массивы содержат пути от корня до узлов в дереве (узлы нумеруются), поэтому они очень похожи на первые значения (так как все пути происходят от корня).

Я использую Google Guava Hasher , я добавляю каждое значение моего массива в хеш, чтобы получить hashCode:

HashFunction hashFunction = Hashing.murmur3_128();
Hasher hasher = hashFunction.newHasher();
for (int i: myArray) {
    hasher.putInt(i);
}
int hashCode = inthasher.hash().asInt();

Я бы хотел избежать хэшированиявесь массив снова для каждого пути и только хэшируйте последние значения, добавляя последние значения в копию моего хэша.Например:

anotherHasher = hasher.clone();
anotherHasher.putInt(someInt);
int hashCode = hasher.hash().asInt();
int anotherHashCode = anotherHasher.hash().asInt();

Но метод клонирования не существует для Hasher.

. Сохранит ли этот тип копии время вычисления?Можно ли реализовать Cloneable с помощью оболочки, содержащей Hasher, даже если последняя не является клонируемой?Если да, то как?Есть ли другой способ?

РЕДАКТИРОВАТЬ: Что касается записей, то для хэширования с помощью Guava требуется не добавление элементов с hasher.putInt(someInt), а само хеширование, вызываемое в конце с hasher.hash(),Так что даже глубокое копирование было быстрым (что не так, см. Ответ Томаша Линковски), мой подход не имеет значения и не заслуживает дальнейшего изучения.

1 Ответ

0 голосов
/ 09 октября 2018

Это можно сделать с помощью библиотеки, которая выполняет глубокое копирование объекта (вот некоторые рекомендации по глубокому копированию библиотеки ).

Один такойБиблиотека Kryo , с которой это может быть достигнуто:

  1. Создание Kryo (обратите внимание, что создание этого объекта довольно дорого + это не поточно-ориентированный):

    Kryo kryo = new Kryo();
    kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
    
  2. Вызов Kryo.copy(T):

    Hasher anotherHasher = kryo.copy(hasher)
    

Однако учтите, что это может не будет быстрее, чем хеширование в два раза, потому что:

  • Крио StdInstantiatorStrategy использует Objenesis для реализации Hasher реализаций (и я не знаю, насколько быстроэто так);
  • и рекомендуемый DefaultInstantiatorStrategy не может быть использован, потому что реализации Hasher не имеют конструктора без аргументов (см. Kryo readme о InstantiatorStrategy для получения дополнительной информации).

Я бы порекомендовал сделать это с помощью Java Microbenchmark Harness (обратите внимание на различные плагины JMH в концесвязанная страница).

...