Commit 4f379f81 authored by Joshua Haberman's avatar Joshua Haberman Committed by GitHub

Merge pull request #2144 from abscondment/fix-jruby-hash

Fix hash computation for JRuby's RubyMessage
parents 7b00595d 05aa0df5
......@@ -41,6 +41,8 @@ import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.ByteList;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
......@@ -164,8 +166,21 @@ public class RubyMessage extends RubyObject {
*/
@JRubyMethod
public IRubyObject hash(ThreadContext context) {
int hashCode = System.identityHashCode(this);
return context.runtime.newFixnum(hashCode);
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
for (RubyMap map : maps.values()) {
digest.update((byte) map.hashCode());
}
for (RubyRepeatedField repeatedField : repeatedFields.values()) {
digest.update((byte) repeatedFields.hashCode());
}
for (IRubyObject field : fields.values()) {
digest.update((byte) field.hashCode());
}
return context.runtime.newString(new ByteList(digest.digest()));
} catch (NoSuchAlgorithmException ignore) {
return context.runtime.newFixnum(System.identityHashCode(this));
}
}
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment