//! Fast, SIMD-accelerated CRC32 (IEEE) checksum computation. //! //! ## Usage //! //! ### Simple usage //! //! For simple use-cases, you can call the [`hash()`] convenience function to //! directly compute the CRC32 checksum for a given byte slice: //! //! ```rust //! let checksum = crc32fast::hash(b"foo bar baz"); //! ``` //! //! ### Advanced usage //! //! For use-cases that require more flexibility or performance, for example when //! processing large amounts of data, you can create and manipulate a [`Hasher`]: //! //! ```rust //! use crc32fast::Hasher; //! //! let mut hasher = Hasher::new(); //! hasher.update(b"foo bar baz"); //! let checksum = hasher.finalize(); //! ``` //! //! ## Performance //! //! This crate contains multiple CRC32 implementations: //! //! - A fast baseline implementation which processes up to 16 bytes per iteration //! - An optimized implementation for modern `x86` using `sse` and `pclmulqdq` instructions //! //! Calling the [`Hasher::new`] constructor at runtime will perform a feature detection to select the most //! optimal implementation for the current CPU feature set.
mod baseline; mod combine; mod specialized; mod table;
/// Computes the CRC32 hash of a byte slice. /// /// Check out [`Hasher`] for more advanced use-cases. pubfn hash(buf: &[u8]) -> u32 { letmut h = Hasher::new();
h.update(buf);
h.finalize()
}
#[derive(Clone)] enum State {
Baseline(baseline::State),
Specialized(specialized::State),
}
impl Hasher { /// Create a new `Hasher`. /// /// This will perform a CPU feature detection at runtime to select the most /// optimal implementation for the current processor architecture. pubfn new() -> Self { Self::new_with_initial(DEFAULT_INIT_STATE)
}
/// Create a new `Hasher` with an initial CRC32 state. /// /// This works just like `Hasher::new`, except that it allows for an initial /// CRC32 state to be passed in. pubfn new_with_initial(init: u32) -> Self { Self::new_with_initial_len(init, 0)
}
/// Create a new `Hasher` with an initial CRC32 state. /// /// As `new_with_initial`, but also accepts a length (in bytes). The /// resulting object can then be used with `combine` to compute `crc(a || /// b)` from `crc(a)`, `crc(b)`, and `len(b)`. pubfn new_with_initial_len(init: u32, amount: u64) -> Self { Self::internal_new_specialized(init, amount)
.unwrap_or_else(|| Self::internal_new_baseline(init, amount))
}
/// Combine the hash state with the hash state for the subsequent block of bytes. pubfn combine(&mutself, other: &Self) { self.amount += other.amount; let other_crc = other.clone().finalize(); matchself.state {
State::Baseline(refmut state) => state.combine(other_crc, other.amount),
State::Specialized(refmut state) => state.combine(other_crc, other.amount),
}
}
}
fn combine_from_len(bytes_1: Vec<u8>, bytes_2: Vec<u8>) -> bool { letmut hash_a = Hasher::new();
hash_a.update(&bytes_1); let a = hash_a.finalize();
letmut hash_b = Hasher::new();
hash_b.update(&bytes_2); let b = hash_b.finalize();
letmut hash_ab = Hasher::new();
hash_ab.update(&bytes_1);
hash_ab.update(&bytes_2); let ab = hash_ab.finalize();
letmut reconstructed = Hasher::new_with_initial_len(a, bytes_1.len() as u64); let hash_b_reconstructed = Hasher::new_with_initial_len(b, bytes_2.len() as u64);
reconstructed.combine(&hash_b_reconstructed);
reconstructed.finalize() == ab
}
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-07-06)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.