天天看點

redis-CRC16CRC16

CRC16

當資料幀長度在8bits-128bits範圍内時,推薦CRC-8(CRC-8能夠減少額外比特的開銷,且有更好的性能表現)

當資料幀長度在128bits-2048bits範圍内時,推薦CRC-12,CRC-16,CRC-CCITT(CRC-12額外比特的開銷更小,且用于6bit字元流的傳輸;對于16bits的标準,更推薦美國标準CRC-16,性能略優于CRC-CCITT);

當因資料幀長度更長、信道不穩定等情況而需要更高的性能時,CRC-32、CRC-32C将是更好的選擇;

Redis-基于位元組查表法的CRC校驗碼生成算法

CRC16的校驗碼是兩個位元組,是以Redis的源碼中使用了 uint16_t類型(unsigned short int)

CRC16要校驗的資料位是8位

在求解CRC校驗碼的過程中,會用到模二除,實際我們最後不關心它的商Q(x),隻關心關心餘數R(x),它也是兩個位元組的大小

餘數R(x)分為高位元組RH(x)和低位元組RL(x)兩個部分:R(x) = RH(x) * X^8 + RL(x) (這個+,可以了解成異或,也可以了解成+号)

任何數和0異或結果還是這個數

流程

  1. CRC-16碼由兩個位元組構成,在開始時CRC寄存器的每一位都預置為1
  2. 然後把CRC寄存器與8-bit的資料進行異或
  3. 之後對CRC寄存器從高到低進行移位,在最高位(MSB)的位置補零,而最低位(LSB,移位後已經被移出CRC寄存器)如果為1,則把寄存器與預定義的多項式碼進行異或,否則如果LSB為零,則無需進行異或。
  4. 重複上述的由高至低的移位8次,第一個8-bit資料處理完畢
  5. 用此時CRC寄存器的值與下一個8-bit資料異或并進行如前一個資料似的8次移位。
  6. 所有的字元處理完成後CRC寄存器内的值即為最終的CRC值。

Redis使用的是CRC-16-CCITT标準,即G(x)為:x^16 + x^12 + x^5 + 1 。

G(x)的通常表征方式是将多項式轉換成二進制: 1 0001 0000 0010 0001。用十六進制表示為:0x11021。