You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by fo...@apache.org on 2020/04/04 09:44:13 UTC

[avro] branch master updated: AVRO-2704: Cache Hashcode of UTF8 Strings (#783)

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

fokko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new d5d1cd7  AVRO-2704: Cache Hashcode of UTF8 Strings (#783)
d5d1cd7 is described below

commit d5d1cd70e920f45468bf696d3668b496a9adbab3
Author: belugabehr <12...@users.noreply.github.com>
AuthorDate: Sat Apr 4 05:44:03 2020 -0400

    AVRO-2704: Cache Hashcode of UTF8 Strings (#783)
    
    Co-authored-by: David Mollitor <dm...@apache.org>
---
 lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java  | 12 +++++++++---
 .../avro/src/test/java/org/apache/avro/util/TestUtf8.java    | 12 ++++++++++++
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java b/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java
index e6d9251..2302276 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/util/Utf8.java
@@ -48,6 +48,8 @@ public class Utf8 implements Comparable<Utf8>, CharSequence {
   }
 
   private byte[] bytes = EMPTY;
+  private int hash = 0;
+  private boolean hasHash = false;
   private int length;
   private String string;
 
@@ -117,6 +119,7 @@ public class Utf8 implements Comparable<Utf8>, CharSequence {
     }
     this.length = newLength;
     this.string = null;
+    this.hasHash = false;
     return this;
   }
 
@@ -166,9 +169,12 @@ public class Utf8 implements Comparable<Utf8>, CharSequence {
 
   @Override
   public int hashCode() {
-    int hash = 0;
-    for (int i = 0; i < this.length; i++)
-      hash = hash * 31 + bytes[i];
+    if (!hasHash) {
+      for (int i = 0; i < length; i++) {
+        hash = hash * 31 + bytes[i];
+      }
+      hasHash = true;
+    }
     return hash;
   }
 
diff --git a/lang/java/avro/src/test/java/org/apache/avro/util/TestUtf8.java b/lang/java/avro/src/test/java/org/apache/avro/util/TestUtf8.java
index 2692d7e..60c8f71 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/util/TestUtf8.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/util/TestUtf8.java
@@ -48,4 +48,16 @@ public class TestUtf8 {
     assertEquals(4, u.getByteLength());
     assertSame(content, u.getBytes());
   }
+
+  @Test
+  public void testHashCodeReused() {
+    Utf8 u = new Utf8("a");
+    assertEquals(97, u.hashCode());
+
+    u.setByteLength(2);
+    u.set("zz");
+
+    assertEquals(97121, u.hashCode());
+    assertEquals(97121, u.hashCode());
+  }
 }