CRC16

當數據幀長度在8bits-128bits範圍內時,推薦CRC-8(CRC-8可以減小額外比特的開銷,且有更好的性能表現)
當數據幀長度在128bits-2048bits範圍內時,推薦CRC-12,CRC-16,CRC-CCITT(CRC-12額外比特的開銷更小,且用於6bit字符流的傳輸;對於16bits的標準,更推薦美國標準CRC-16,性能略優於CRC-CCITT);
當因數據幀長度更長、信道不穩定等狀況而須要更高的性能時,CRC-3二、CRC-32C將是更好的選擇;redis

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。性能

相關文章
相關標籤/搜索