讀Redis學C語言設計之三 CRC資料校驗

2021-06-28 04:42:43 字數 876 閱讀 8620

redis裡面在網路傳輸和rdb備份的時候都會面臨著資料出錯的問題,因此採用了資料的校驗。包括使用了crc64的校驗演算法。crc檢驗原理實際上就是在乙個p位二進位制資料序列之後附加乙個r位二進位制檢驗碼(序列),從而構成乙個總長為n=p+r位的二進位制序列;附加在資料序列之後的這個檢驗碼與資料序列的內容之間存在著某種特定的關係。如果因干擾等原因使資料序列中的某一位或某些位發生錯誤,這種特定關係就會被破壞。因此,通過檢查這一關係,就可以實現對資料正確性的檢驗。redis裡面的crc演算法實現如下:

uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l) 

return crc;

}

其中crc64_tab裡儲存的是每個字元中的多項式:碼字長度為64bit的crc編碼。常用的生成多項式有:

x^64

+ x^4

+ x^3+ x

+ 1

從c語言的設計來講,因為字元uchar是0-255的值,對這個多項式只有256個離散值,因此可以使用乙個tab儲存。因此就有乙個crc64_tab。在校驗的時候就是發出乙個原資訊和乙個crc校驗碼。只要接收方講接受資訊和校驗碼取餘就可以看出是否有錯。如果取余為0,則說明傳輸沒有錯。

儘管crc在錯誤檢測中非常有用,但crc並不能可靠地校驗資料完整性,這是因為crc多項式是線性結構,可以非常容易地通過改變資料方式達到crc碰撞,這裡給乙個更加通俗的解釋,假設一串帶有crc校驗的**在傳輸中,如果連續出現差錯,當出錯次數達到一定次數時,那麼幾乎可以肯定會出現一次碰撞(值不對但crc結果正確),但隨著crc資料位增加,碰撞機率會顯著降低,比如crc32比crc16具有更可靠的驗證性,crc64又會比crc32更可靠,當然這都是按照itu規範標準條件下

C語言學習之三 常量

常量的值不允許修改,使用const關鍵字來宣告常量,如下 int const a const int a 以上二個宣告相等,都把a聲時為乙個整數,其值不允許修改。int const pi a 這個宣告表示pi是乙個指向整型的指標,允許修改指標的值,即可以讓指標指向其它位址,但是不可以修改指標所指向的...

C語言基礎知識之三

1.時間複雜度 t n o f n 只保留最高項 不要係數 1 o f n o 1 2 for 1層迴圈 o f n o n 3 for 2層迴圈,o f n o n 2 4 for 3層迴圈,o f n o n 3 5 for int i 2 i n i for int j 2 j i 1 j 共...

C語言之三聯符

考察如下 c 程式 include int main 你可能看著會覺得很奇怪,然而這卻是一段合法的 c 程式,我在 vc2008 中嘗試編譯並成功.實際上,三聯符序列就是以 開頭的三個字元,用來對某個其它字元進行指定替換,替換規則如下表 三聯符替換 現在就可以解釋很久以前某人遇到過的乙個奇怪問題了 ...