You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@orc.apache.org by do...@apache.org on 2021/07/16 16:44:24 UTC

[orc] branch main updated: ORC-844: Improve hashCode Methods (#747)

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

dongjoon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/orc.git


The following commit(s) were added to refs/heads/main by this push:
     new b46712c  ORC-844: Improve hashCode Methods (#747)
b46712c is described below

commit b46712c9e7e286a653ba21be9f983d9168a45491
Author: belugabehr <12...@users.noreply.github.com>
AuthorDate: Fri Jul 16 12:44:17 2021 -0400

    ORC-844: Improve hashCode Methods (#747)
    
    ### What changes were proposed in this pull request?
    Auto-generate some hashCode methods.
    
    ### Why are the changes needed?
    Better hash code values for better distributions; less code.
    
    ### How was this patch tested?
    No changes to functionality. Use existing unit tests.
---
 java/core/src/java/org/apache/orc/TypeDescription.java    | 15 ++++++++-------
 .../java/org/apache/orc/impl/ColumnStatisticsImpl.java    |  5 +++--
 .../src/java/org/apache/orc/impl/MaskDescriptionImpl.java |  8 ++++----
 java/core/src/java/org/apache/orc/util/BloomFilter.java   |  6 +-----
 .../src/java/org/apache/orc/mapred/OrcStruct.java         |  9 ++-------
 .../src/test/org/apache/orc/mapred/TestOrcStruct.java     |  4 ++--
 6 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/java/core/src/java/org/apache/orc/TypeDescription.java b/java/core/src/java/org/apache/orc/TypeDescription.java
index 644a30a..1b8f1cb 100644
--- a/java/core/src/java/org/apache/orc/TypeDescription.java
+++ b/java/core/src/java/org/apache/orc/TypeDescription.java
@@ -380,13 +380,14 @@ public class TypeDescription
 
   @Override
   public int hashCode() {
-    long result = category.ordinal() * 4241 + maxLength + precision * 13 + scale;
-    if (children != null) {
-      for(TypeDescription child: children) {
-        result = result * 6959 + child.hashCode();
-      }
-    }
-    return (int) result;
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + category.hashCode();
+    result = prime * result + children.hashCode();
+    result = prime * result + maxLength;
+    result = prime * result + precision;
+    result = prime * result + scale;
+    return result;
   }
 
   @Override
diff --git a/java/core/src/java/org/apache/orc/impl/ColumnStatisticsImpl.java b/java/core/src/java/org/apache/orc/impl/ColumnStatisticsImpl.java
index 7f8180e..df1b729 100644
--- a/java/core/src/java/org/apache/orc/impl/ColumnStatisticsImpl.java
+++ b/java/core/src/java/org/apache/orc/impl/ColumnStatisticsImpl.java
@@ -1864,9 +1864,10 @@ public class ColumnStatisticsImpl implements ColumnStatistics {
 
     @Override
     public int hashCode() {
+      final int prime = 31;
       int result = super.hashCode();
-      result = 31 * result + (int) minimum;
-      result = 31 * result + (int) maximum;
+      result = prime * result + (int) (maximum ^ (maximum >>> 32));
+      result = prime * result + (int) (minimum ^ (minimum >>> 32));
       return result;
     }
   }
diff --git a/java/core/src/java/org/apache/orc/impl/MaskDescriptionImpl.java b/java/core/src/java/org/apache/orc/impl/MaskDescriptionImpl.java
index 45fc7f4..721aec0 100644
--- a/java/core/src/java/org/apache/orc/impl/MaskDescriptionImpl.java
+++ b/java/core/src/java/org/apache/orc/impl/MaskDescriptionImpl.java
@@ -118,10 +118,10 @@ public class MaskDescriptionImpl implements DataMaskDescription,
 
   @Override
   public int hashCode() {
-    int result = name.hashCode();
-    for (String p: parameters) {
-      result = result * 101 + p.hashCode();
-    }
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((name == null) ? 0 : name.hashCode());
+    result = prime * result + Arrays.hashCode(parameters);
     return result;
   }
 
diff --git a/java/core/src/java/org/apache/orc/util/BloomFilter.java b/java/core/src/java/org/apache/orc/util/BloomFilter.java
index dd75b9a..0041cba 100644
--- a/java/core/src/java/org/apache/orc/util/BloomFilter.java
+++ b/java/core/src/java/org/apache/orc/util/BloomFilter.java
@@ -324,11 +324,7 @@ public class BloomFilter {
 
     @Override
     public int hashCode() {
-      int result = 0;
-      for(long l: data) {
-        result = (int) (result * 13 + l);
-      }
-      return result;
+      return Arrays.hashCode(data);
     }
   }
 }
diff --git a/java/mapreduce/src/java/org/apache/orc/mapred/OrcStruct.java b/java/mapreduce/src/java/org/apache/orc/mapred/OrcStruct.java
index d24d3a7..c02054a 100644
--- a/java/mapreduce/src/java/org/apache/orc/mapred/OrcStruct.java
+++ b/java/mapreduce/src/java/org/apache/orc/mapred/OrcStruct.java
@@ -34,6 +34,7 @@ import org.apache.orc.TypeDescription;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Arrays;
 
 public final class OrcStruct implements WritableComparable<OrcStruct> {
 
@@ -147,13 +148,7 @@ public final class OrcStruct implements WritableComparable<OrcStruct> {
 
   @Override
   public int hashCode() {
-    int result = fields.length;
-    for(Object field: fields) {
-      if (field != null) {
-        result ^= field.hashCode();
-      }
-    }
-    return result;
+    return Arrays.hashCode(fields);
   }
 
   @Override
diff --git a/java/mapreduce/src/test/org/apache/orc/mapred/TestOrcStruct.java b/java/mapreduce/src/test/org/apache/orc/mapred/TestOrcStruct.java
index e279c2f..0b1ebdb 100644
--- a/java/mapreduce/src/test/org/apache/orc/mapred/TestOrcStruct.java
+++ b/java/mapreduce/src/test/org/apache/orc/mapred/TestOrcStruct.java
@@ -63,7 +63,7 @@ public class TestOrcStruct {
     expected.setFieldValue(0, new IntWritable(1));
     expected.setFieldValue(1, new LongWritable(2));
     expected.setFieldValue(2, new Text("wow"));
-    assertEquals(147710, expected.hashCode());
+    assertEquals(178524, expected.hashCode());
     assertNotEquals(expected, actual);
     TestOrcList.cloneWritable(expected, actual);
     assertEquals(expected, actual);
@@ -72,7 +72,7 @@ public class TestOrcStruct {
     expected.setFieldValue(2, null);
     TestOrcList.cloneWritable(expected, actual);
     assertEquals(expected, actual);
-    assertEquals(3, expected.hashCode());
+    assertEquals(29791, expected.hashCode());
     expected.setFieldValue(1, new LongWritable(111));
     assertEquals(111, ((LongWritable) expected.getFieldValue(1)).get());
     TestOrcList.cloneWritable(expected, actual);