В настоящее время способ реализации хешей не реализуется. Я отслеживал работу в visualVM и видел, что слишком много времени процессора расходуется на MessageDigest
. Вот код:Оптимизированный способ генерации большого количества хэшей
public static byte[] getHash(byte[] value) {
HashCode hashCode = hashFunction.newHasher().putBytes(value).hash();
return hashCode.asBytes();
}
выше метод вызывается в цикле:
List<byte[]> someList;
for(byte[] payload : someMap.values()) {
someList.add(getHash(payload));
}
В принципе, у меня есть map<SomeObject, byte[] payload)
и мне нужно хэш отдельных значений и положить их в List<byte[]>
. Я использую хешер guava, и карта ввода будет огромной. Что-нибудь я могу сделать лучше здесь? Причина, по которой мне нужно хэшировать все эти значения, заключается в том, что мне нужно хранить их в HBase.
EDIT алгоритм хэширования Я использую здесь MD5
я бы искать более простой хэш, один, который работает непосредственно на массив байтов. Хэш-алгоритм, используемый в String, вероятно, довольно приличный: 's [0] * 31^(n-1) + s [1] * 31^(n-2) + ... + s [n-1]'. Если вы посмотрите на источник, алгоритм является простым для цикла с h = 31 * h + val [off ++]; 'inside ,. –
Некоторые функции хэша будут работать быстрее - и никто не будет работать медленнее - если вы используете 'hashFunction.hashBytes (значение)' вместо 'hashFunction.newHasher(). PutBytes (value) .hash()'. –