diff --git a/Cargo.lock b/Cargo.lock index 327292c9..9bae0531 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1616,7 +1616,7 @@ checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ry" -version = "0.0.35" +version = "0.0.36" dependencies = [ "jiff", "pyo3", @@ -1628,7 +1628,7 @@ dependencies = [ [[package]] name = "ryo3" -version = "0.0.35" +version = "0.0.36" dependencies = [ "jiff", "pyo3", @@ -1673,7 +1673,7 @@ dependencies = [ [[package]] name = "ryo3-brotli" -version = "0.0.35" +version = "0.0.36" dependencies = [ "brotli", "pyo3", @@ -1681,7 +1681,7 @@ dependencies = [ [[package]] name = "ryo3-bytes" -version = "0.0.35" +version = "0.0.36" dependencies = [ "ahash", "bytes", @@ -1690,7 +1690,7 @@ dependencies = [ [[package]] name = "ryo3-bzip2" -version = "0.0.35" +version = "0.0.36" dependencies = [ "bzip2", "pyo3", @@ -1698,7 +1698,7 @@ dependencies = [ [[package]] name = "ryo3-core" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "pyo3-build-config", @@ -1706,7 +1706,7 @@ dependencies = [ [[package]] name = "ryo3-dev" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-bytes", @@ -1719,7 +1719,7 @@ dependencies = [ [[package]] name = "ryo3-dirs" -version = "0.0.35" +version = "0.0.36" dependencies = [ "dirs", "pyo3", @@ -1727,7 +1727,7 @@ dependencies = [ [[package]] name = "ryo3-flate2" -version = "0.0.35" +version = "0.0.36" dependencies = [ "flate2", "pyo3", @@ -1736,7 +1736,7 @@ dependencies = [ [[package]] name = "ryo3-fnv" -version = "0.0.35" +version = "0.0.36" dependencies = [ "fnv", "pyo3", @@ -1744,7 +1744,7 @@ dependencies = [ [[package]] name = "ryo3-fspath" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-bytes", @@ -1756,7 +1756,7 @@ dependencies = [ [[package]] name = "ryo3-globset" -version = "0.0.35" +version = "0.0.36" dependencies = [ "globset", "pyo3", @@ -1765,7 +1765,7 @@ dependencies = [ [[package]] name = "ryo3-heck" -version = "0.0.35" +version = "0.0.36" dependencies = [ "heck", "pyo3", @@ -1773,7 +1773,7 @@ dependencies = [ [[package]] name = "ryo3-http" -version = "0.0.35" +version = "0.0.36" dependencies = [ "http", "pyo3", @@ -1784,7 +1784,7 @@ dependencies = [ [[package]] name = "ryo3-jiff" -version = "0.0.35" +version = "0.0.36" dependencies = [ "jiff", "pyo3", @@ -1795,7 +1795,7 @@ dependencies = [ [[package]] name = "ryo3-jiter" -version = "0.0.35" +version = "0.0.36" dependencies = [ "jiter", "pyo3", @@ -1804,21 +1804,21 @@ dependencies = [ [[package]] name = "ryo3-macros" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", ] [[package]] name = "ryo3-quick-maths" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", ] [[package]] name = "ryo3-regex" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "regex", @@ -1826,7 +1826,7 @@ dependencies = [ [[package]] name = "ryo3-reqwest" -version = "0.0.35" +version = "0.0.36" dependencies = [ "bytes", "futures-core", @@ -1847,7 +1847,7 @@ dependencies = [ [[package]] name = "ryo3-same-file" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-core", @@ -1856,7 +1856,7 @@ dependencies = [ [[package]] name = "ryo3-shlex" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "shlex", @@ -1864,7 +1864,7 @@ dependencies = [ [[package]] name = "ryo3-size" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "size", @@ -1872,7 +1872,7 @@ dependencies = [ [[package]] name = "ryo3-sqlformat" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "sqlformat", @@ -1880,7 +1880,7 @@ dependencies = [ [[package]] name = "ryo3-std" -version = "0.0.35" +version = "0.0.36" dependencies = [ "bytes", "pyo3", @@ -1891,7 +1891,7 @@ dependencies = [ [[package]] name = "ryo3-tokio" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "pyo3-async-runtimes", @@ -1902,7 +1902,7 @@ dependencies = [ [[package]] name = "ryo3-unindent" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "unindent", @@ -1910,7 +1910,7 @@ dependencies = [ [[package]] name = "ryo3-url" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-macros", @@ -1919,7 +1919,7 @@ dependencies = [ [[package]] name = "ryo3-walkdir" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-core", @@ -1930,7 +1930,7 @@ dependencies = [ [[package]] name = "ryo3-which" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-regex", @@ -1939,7 +1939,7 @@ dependencies = [ [[package]] name = "ryo3-xxhash" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "ryo3-bytes", @@ -1948,7 +1948,7 @@ dependencies = [ [[package]] name = "ryo3-zstd" -version = "0.0.35" +version = "0.0.36" dependencies = [ "pyo3", "zstd", diff --git a/crates/ryo3-fnv/src/lib.rs b/crates/ryo3-fnv/src/lib.rs index 9fe287a2..69301908 100644 --- a/crates/ryo3-fnv/src/lib.rs +++ b/crates/ryo3-fnv/src/lib.rs @@ -2,8 +2,9 @@ use std::hash::Hasher; use ::fnv as fnv_rs; -use pyo3::types::PyModule; -use pyo3::{intern, prelude::*}; +use pyo3::types::{PyModule, PyTuple}; + +use pyo3::{intern, prelude::*, IntoPyObjectExt}; use pyo3::{wrap_pyfunction, PyResult}; #[pyclass(name = "FnvHasher", module = "ryo3")] @@ -14,20 +15,38 @@ pub struct PyFnvHasher { #[pymethods] impl PyFnvHasher { #[new] - #[pyo3(signature = (s = None))] - fn py_new(s: Option<&[u8]>) -> Self { - match s { - Some(s) => { + #[pyo3(signature = (s = None, *, key = None))] + fn py_new(s: Option<&[u8]>, key: Option) -> Self { + match (key, s) { + (Some(k), Some(s)) => { + let mut hasher = fnv_rs::FnvHasher::with_key(k); + hasher.write(s); + Self { hasher } + } + (Some(k), None) => Self { + hasher: fnv_rs::FnvHasher::with_key(k), + }, + (None, Some(s)) => { let mut hasher = fnv_rs::FnvHasher::default(); hasher.write(s); Self { hasher } } - None => Self { + (None, None) => Self { hasher: fnv_rs::FnvHasher::default(), }, } } + fn __getnewargs__<'py>(&self, py: Python<'py>) -> PyResult> { + PyTuple::new( + py, + [ + py.None().into_bound_py_any(py)?, + self.hasher.finish().into_bound_py_any(py)?, + ], + ) + } + fn __str__(&self) -> String { format!("fnv1a<{:x}>", self.hasher.finish()) } @@ -63,8 +82,19 @@ impl PyFnvHasher { } #[pyfunction] -pub fn fnv1a(s: &[u8]) -> PyResult { - Ok(PyFnvHasher::py_new(Some(s))) +#[pyo3(signature = (s, key = None))] +pub fn fnv1a(s: &[u8], key: Option) -> PyResult { + Ok(PyFnvHasher { + hasher: if let Some(k) = key { + let mut hasher = fnv_rs::FnvHasher::with_key(k); + hasher.write(s); + hasher + } else { + let mut hasher = fnv_rs::FnvHasher::default(); + hasher.write(s); + hasher + }, + }) } pub fn pymod_add(m: &Bound<'_, PyModule>) -> PyResult<()> {