如果您需要執行大量比較,則可以將MD5值存儲爲2 long
整數,這樣您只需執行至多4個邏輯操作即可檢查另一個MD5值。
基本上,提供一類,將接受的輸入,原始摘要數據作爲byte[]
並使用
ByteBuffer bb = ByteBuffer.wrap(digestData);
long[] bits = new long[] {
bb.getLong(),
bb.getLong()
};
與另一long[]
MD5陣列進行比較以
boolean eq = ((bits[0]^otherBits[0]) | (bits[1]^otherBits[1])) == 0);
與
重構MD5
ByteBuffer bb = ByteBuffer.allocate(16);
bb.putLong(bits[0]);
bb.putLong(bits[1]);
byte[] digestData = new byte[16];
bb.get(digestData);
注:我不建議對byte[]
轉換成long[]
每一個比較,這簡直是如何存儲消化爲比較。最後一個重建片段是可選的,您應該保留數據爲byte[]
並僅比較long[]
陣列。在數據庫中,將數據存儲爲32字節的十六進制值。
謝謝你的回答。與常規'新的BigInteger(1,摘要)的ToString(16).padLeft(32,「0」)'可以生成從'字節散列[]'但不知道這是「有效的」照顧。如果我必須在BigInt和String之間進行選擇,你會有什麼建議?我問這是因爲這只是一個常規腳本,創建一個包裝可能是矯枉過正的(如果它沒有巨大的性能優勢)。 – kunal
@kunal,如果被迫在bigint和string之間進行選擇,我會選擇BigInteger。當您將一系列十六進制數字作爲字符串進行天真存儲時,字符串不具有空間效率。你可以將代碼打包成UTF-16代碼單元,但沒有任何理由去解決問題。所有這些工作所節省的最多成本是BigBenteger的16b。 –
再次感謝您的回答。正如@erickson提到的那樣,將它存儲很長時間呢? – kunal