想象一下,您有一個MD5和,它是從一個數組N 64字節元素計算得出的。我想用新元素替換源數組中任意索引處的元素。然後,我不想通過重新運行MD5函數來重新計算MD5總和,而是想從結果中「減去」舊的元素,並將新的數據「添加」到它。從MD5校驗和中提取數據
是有點更清晰,這裏的一些僞斯卡拉:
class Block {
var summary: MD5Result
// The key reason behind this question is that the elements might not be
// loaded. With a large array, it can get expensive to load everything just to
// update a single thing.
var data: Array[Option[Element]]
def replaceElement(block: Block, index: Integer, newElement: Element) = {
// we can know the element that we're replacing
val oldElement = block.data(index) match {
case Some(x) => x
case None => loadData(index) // <- this is expensive
}
// update the MD5 using this magic function
summary = replaceMD5(summary, index, oldElement, newElement)
}
}
是replaceMD5
實現的?雖然所有的跡象都指出「這是一個(弱)加密散列」,但實際的MD5算法似乎支持這樣做(但我可能會漏掉一些明顯的東西)。
TTBOMK MD5計算嚴格按升序進行字節處理。如果是這樣,那麼可以在每個64字節單元之後記錄MD5計算的中間(狀態)值的順序:然後如果data [i]被更改,則可以從這一點重新開始MD5計算,即重新計算剩餘的n-i + 1)* 64字節。如果變化是隨機的,這將平均節省一半的計算量。 TTBOMK任何改變都會以不可預知的方式改變所有「下游」狀態,所以我懷疑可以採取任何措施來緩解接近開始的變化。 –
我相信,如果不花費更多的時間,然後重新運行md5,這是不可能的。你能告訴你爲什麼你認爲**實際的MD5算法似乎支持這樣做**? –
問題不在於重新運行算法的計算時間 - 而是我必須執行昂貴的操作(IO)才能確定哪些數據甚至可以提供算法。 –