|  | @@ -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));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /*
 |