摘要算法的流式計(jì)算
MD2、4、5和SHA的算法描述中,數(shù)據(jù)都是一次性讀入,然后按分組長(zhǎng)度計(jì)算的。如果數(shù)據(jù)量很大,這種方法顯然就不可行。更理想的方案是將摘要算法視為一個(gè)流,不斷向其中推入數(shù)據(jù),每一次推入都執(zhí)行摘要更新,并丟棄之前推入的數(shù)據(jù)。以MD2為例,其關(guān)鍵思路在于設(shè)置一個(gè)輸入緩沖區(qū)和一個(gè)校驗(yàn)和,每次填入16個(gè)字節(jié)就觸發(fā)一次摘要計(jì)算,并更新一次校驗(yàn)和,輸出最終結(jié)果前,再對(duì)校驗(yàn)和的16個(gè)字節(jié)計(jì)算一次摘要。首先定義一組推入和終止操作:
MD2的算法輸入為16字節(jié),其推入數(shù)據(jù)的代碼如下:
每一次存儲(chǔ)數(shù)據(jù)超過16字節(jié),就會(huì)觸發(fā)一次摘要計(jì)算,多余出來的數(shù)據(jù)還要再次填入緩沖區(qū)里面。最終輸出時(shí),還要再對(duì)校驗(yàn)和計(jì)算一次摘要,代碼如下:
????摘要的實(shí)際計(jì)算部分代碼如下:
標(biāo)簽: