This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 6c77cd56e Implement `Hash` for `Schema` (#2183)
6c77cd56e is described below

commit 6c77cd56e213d8e0cda05d6dd3af1d7022be387b
Author: Marco Neumann <[email protected]>
AuthorDate: Thu Jul 28 13:24:33 2022 +0200

    Implement `Hash` for `Schema` (#2183)
    
    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 5a7336624..1574b1654 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<H: std::hash::Hasher>(&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,

Reply via email to