目前,我實現哈希生成的方式不可擴展。我監視了visualVM中的運行,並看到在MessageDigest
中花費了太多的CPU時間。下面是代碼:生成大量哈希的優化方式
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[]>
。我使用番石榴的哈希和輸入地圖將是巨大的。有什麼我可以在這裏做得更好嗎? 我需要散列所有這些值的原因是因爲我需要將它們存儲在HBase中。
編輯我在這裏使用的哈希算法是MD5
我會尋找一個更簡單的散列,一個直接操作字節數組。在String中使用的散列算法可能相當不錯:'s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]'。如果你看看源代碼,算法是一個簡單的for循環,其中h = 31 * h + val [off ++];'inside ,. –
如果你使用'hashFunction.hashBytes(value)'而不是'hashFunction.newHasher()。putBytes(value).hash()',一些散列函數的運行速度會更快 - 而且沒有一個會運行得更慢。 –