1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
//! This crate provides the CRC-32-Castagnoli algorithm. //! //! It provides both a software implementation, and a hardware-optimized one for SSE 4.2. //! //! # Example //! //! ```rust //! let message = b"Hello world!"; //! //! let crc = crc32c::crc32c(message); //! //! assert_eq!(crc, 0x7B_98_E7_51); //! ``` //! //! # Enabling hardware acceleration //! //! If you compile your code with `-C target-features=+sse4.2`, //! then the hardware-optimized version will be compiled into the code. //! //! Otherwise, the crate will use `cpuid` at runtime to detect the //! running CPU's features, and enable the appropiate algorithm. #![feature(cfg_target_feature, target_feature)] #![no_std] #[macro_use] extern crate stdsimd; mod util; mod sw; mod hw; /// Computes the CRC for the data payload. /// /// Equivalent to calling `crc32c_append(0, data)`. #[inline] pub fn crc32c(data: &[u8]) -> u32 { crc32c_append(0, data) } /// Computes the CRC for the data payload, starting with a previous CRC value. #[inline] pub fn crc32c_append(crc: u32, data: &[u8]) -> u32 { if cfg_feature_enabled!("sse4.2") { hw::crc32c(crc, data) } else { sw::crc32c(crc, data) } }