diff --git a/history.txt b/history.txt index 44ba0f180..7d178bb17 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2012-07-15 zzz + * XORComparator: Reduce object churn (Ticket #658) + 2012-07-12 kytv * Translations from Transifex: - Add new Greek translation diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java index bfd897f0a..9242103cd 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java @@ -6,22 +6,28 @@ import net.i2p.data.DataHelper; import net.i2p.data.Hash; /** - * Help sort Hashes in relation to a base key using the XOR metric - * + * Help sort Hashes in relation to a base key using the XOR metric. + * Warning - not thread safe. */ class XORComparator implements Comparator { private final byte[] _base; + private final byte[] _lx, _rx; /** * @param target key to compare distances with */ public XORComparator(Hash target) { _base = target.getData(); + _lx = new byte[Hash.HASH_LENGTH]; + _rx = new byte[Hash.HASH_LENGTH]; } + /** + * getData() of args must be non-null + */ public int compare(Hash lhs, Hash rhs) { - byte lhsDelta[] = DataHelper.xor(lhs.getData(), _base); - byte rhsDelta[] = DataHelper.xor(rhs.getData(), _base); - return DataHelper.compareTo(lhsDelta, rhsDelta); + DataHelper.xor(lhs.getData(), 0, _base, 0, _lx, 0, Hash.HASH_LENGTH); + DataHelper.xor(rhs.getData(), 0, _base, 0, _rx, 0, Hash.HASH_LENGTH); + return DataHelper.compareTo(_lx, _rx); } }