Java 实现校验和(Checksum)
Java 實(shí)現(xiàn)校驗(yàn)和(Checksum)
本文簡(jiǎn)要解釋什么是校驗(yàn)和以及如何在java中計(jì)算校驗(yàn)和。
1. 校驗(yàn)和及實(shí)現(xiàn)算法
校驗(yàn)和是指?jìng)鬏斘粩?shù)的累加,當(dāng)傳輸結(jié)束時(shí),接收者可以根據(jù)這個(gè)數(shù)值判斷是否接到了所有的數(shù)據(jù)。如果數(shù)值匹配,那么說(shuō)明傳送已經(jīng)完成。通常用來(lái)在通信中,尤其是遠(yuǎn)距離通信中保證數(shù)據(jù)的完整性和準(zhǔn)確性。簡(jiǎn)言之,校驗(yàn)和是二進(jìn)制數(shù)據(jù)流的迷你表示。
在網(wǎng)絡(luò)編程中通常用于檢查信息是否完整接收,在接收到新消息時(shí),可以重新計(jì)算校驗(yàn)和并與接收到的校驗(yàn)和進(jìn)行比較,以確保沒(méi)有丟失任何字節(jié)位。此外,它們還可以用于文件管理,例如,比較文件或檢測(cè)更改。
常用創(chuàng)建校驗(yàn)和的算法有Adler32 和 CRC32。這些算法的工作原理是將一系列數(shù)據(jù)或字節(jié)轉(zhuǎn)換成更小的字母和數(shù)字序列。它們被設(shè)計(jì)成輸入中的任何微小變化都會(huì)導(dǎo)致計(jì)算出的校驗(yàn)和大不相同。
本文介紹Java支持的CRC32算法。需要指出的是CRC32算法用于計(jì)算校驗(yàn)和非常有用,但不建議用于摘要算法,如密碼摘要。
2. CRC32算法示例
2.1 求字符串或字節(jié)數(shù)組校驗(yàn)和
首先需要獲得需要計(jì)算校驗(yàn)和的輸入,如何是字符串,則需要調(diào)用getBytes()獲取字節(jié)數(shù)組:
String test = "test"; byte[] bytes = test.getBytes();接下來(lái)通過(guò)字節(jié)數(shù)組計(jì)算校驗(yàn)和:
public static long getCRC32Checksum(byte[] bytes) {Checksum crc32 = new CRC32();crc32.update(bytes, 0, bytes.length);return crc32.getValue(); }這里使用java內(nèi)置的CRC32類。實(shí)例化之后使用update方法,傳入字節(jié)數(shù)組計(jì)算校驗(yàn)和。簡(jiǎn)單地說(shuō),update方法將替換CRC32對(duì)象所保存的字節(jié),這有助于代碼重用并消除創(chuàng)建校驗(yàn)和新實(shí)例的需要。CRC32類提供了一些被重寫(xiě)的方法,用于替換整個(gè)字節(jié)數(shù)組或其中的幾個(gè)字節(jié)。最后通過(guò)getValue方法返回校驗(yàn)和。
2.2 求輸入流校驗(yàn)和
當(dāng)處理較大數(shù)據(jù)集時(shí),上述方法因加載所有數(shù)據(jù)至內(nèi)存導(dǎo)致效率低下。
如果可以獲取InputStream,可以使用CheckedInputStream 類創(chuàng)建創(chuàng)建校驗(yàn)和。通過(guò)使用這種方法,我們可以定義一次處理多少字節(jié)。
下面例子處理給定一次那些處理字節(jié)的數(shù)量,直到流結(jié)束:
3. 總結(jié)
本文我們介紹了校驗(yàn)和的概念,以及如何使用Java CRC32類計(jì)算字節(jié)數(shù)組或輸入流(InputStream)的校驗(yàn)和。
總結(jié)
以上是生活随笔為你收集整理的Java 实现校验和(Checksum)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 制作属于自己的安全工具包
- 下一篇: Java基础打印日历——知道1901.1