From d924df6436db7c07cd613c0fb946410eadfd8067 Mon Sep 17 00:00:00 2001 From: Marco Neumann Date: Wed, 27 Jul 2022 11:04:48 +0200 Subject: [PATCH] Implement `Hash` for `Schema` Closes #2182. --- arrow/src/datatypes/schema.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/arrow/src/datatypes/schema.rs b/arrow/src/datatypes/schema.rs index 5a7336624f5..1574b165462 100644 --- a/arrow/src/datatypes/schema.rs +++ b/arrow/src/datatypes/schema.rs @@ -18,6 +18,7 @@ use std::collections::HashMap; use std::default::Default; use std::fmt; +use std::hash::Hash; use serde_derive::{Deserialize, Serialize}; use serde_json::{json, Value}; @@ -356,6 +357,22 @@ impl fmt::Display for Schema { } } +// need to implement `Hash` manually because `HashMap` implement Eq but no `Hash` +#[allow(clippy::derive_hash_xor_eq)] +impl Hash for Schema { + fn hash(&self, state: &mut H) { + self.fields.hash(state); + + // ensure deterministic key order + let mut keys: Vec<&String> = self.metadata.keys().collect(); + keys.sort(); + for k in keys { + k.hash(state); + self.metadata.get(k).expect("key valid").hash(state); + } + } +} + #[derive(Deserialize)] struct MetadataKeyValue { key: String,