當數據幀長度在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
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異或結果仍是這個數算法
Redis使用的是CRC-16-CCITT標準,即G(x)爲:x^16 + x^12 + x^5 + 1 。
G(x)的一般表徵方式是將多項式轉換成二進制: 1 0001 0000 0010 0001。用十六進制表示爲:0x11021。性能