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,