Merge pull request #2144 from abscondment/fix-jruby-hash
Fix hash computation for JRuby's RubyMessage
This commit is contained in:
commit
4f379f81ce
@ -41,6 +41,8 @@ import org.jruby.runtime.ThreadContext;
|
|||||||
import org.jruby.runtime.builtin.IRubyObject;
|
import org.jruby.runtime.builtin.IRubyObject;
|
||||||
import org.jruby.util.ByteList;
|
import org.jruby.util.ByteList;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -164,8 +166,21 @@ public class RubyMessage extends RubyObject {
|
|||||||
*/
|
*/
|
||||||
@JRubyMethod
|
@JRubyMethod
|
||||||
public IRubyObject hash(ThreadContext context) {
|
public IRubyObject hash(ThreadContext context) {
|
||||||
int hashCode = System.identityHashCode(this);
|
try {
|
||||||
return context.runtime.newFixnum(hashCode);
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user