aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJisi Liu <jisi.liu@gmail.com>2015-02-06 15:55:04 -0800
committerJisi Liu <jisi.liu@gmail.com>2015-02-06 15:55:04 -0800
commitd9a6f27bc333587fad88b3bc1f53b370a016ccd0 (patch)
tree0f59bedbd0b6d133b5c95219088e4f3fd6f2a700
parent1536e93349b0f8e703060e5efddb91169c93786d (diff)
downloadprotobuf-d9a6f27bc333587fad88b3bc1f53b370a016ccd0.tar.gz
protobuf-d9a6f27bc333587fad88b3bc1f53b370a016ccd0.tar.bz2
protobuf-d9a6f27bc333587fad88b3bc1f53b370a016ccd0.zip
implement hashCode() for JavaNano maps.
-rw-r--r--javanano/src/main/java/com/google/protobuf/nano/InternalNano.java19
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_map_field.cc3
2 files changed, 22 insertions, 0 deletions
diff --git a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
index 044c30dd..f3144652 100644
--- a/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
+++ b/javanano/src/main/java/com/google/protobuf/nano/InternalNano.java
@@ -531,4 +531,23 @@ public final class InternalNano {
}
return a.equals(b);
}
+
+ public static <K, V> int hashCode(Map<K, V> map) {
+ if (map == null) {
+ return 0;
+ }
+ int result = 0;
+ for (Entry<K, V> entry : map.entrySet()) {
+ result += hashCodeForMap(entry.getKey())
+ ^ hashCodeForMap(entry.getValue());
+ }
+ return result;
+ }
+
+ private static int hashCodeForMap(Object o) {
+ if (o instanceof byte[]) {
+ return Arrays.hashCode((byte[]) o);
+ }
+ return o.hashCode();
+ }
}
diff --git a/src/google/protobuf/compiler/javanano/javanano_map_field.cc b/src/google/protobuf/compiler/javanano/javanano_map_field.cc
index c816fb3d..117c4f5c 100644
--- a/src/google/protobuf/compiler/javanano/javanano_map_field.cc
+++ b/src/google/protobuf/compiler/javanano/javanano_map_field.cc
@@ -175,6 +175,9 @@ GenerateEqualsCode(io::Printer* printer) const {
void MapFieldGenerator::
GenerateHashCodeCode(io::Printer* printer) const {
+ printer->Print(variables_,
+ "result = 31 * result +\n"
+ " com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n");
}
} // namespace javanano