Index: jruby-1.5.1/src/org/jruby/RubyHash.java
===================================================================
--- jruby-1.5.1.orig/src/org/jruby/RubyHash.java	2015-04-27 16:19:07.409071162 -0400
+++ jruby-1.5.1/src/org/jruby/RubyHash.java	2015-04-27 16:19:07.397071161 -0400
@@ -809,7 +809,7 @@
             oldTable[j] = null;
             while (entry != null) {
                 RubyHashEntry next = entry.next;
-                entry.hash = entry.key.hashCode(); // update the hash value
+                entry.hash = hashValue(entry.key.hashCode()); // update the hash value
                 int i = bucketIndex(entry.hash, newTable.length);
                 entry.next = newTable[i];
                 newTable[i] = entry;
Index: jruby-1.5.1/src/org/jruby/Ruby.java
===================================================================
--- jruby-1.5.1.orig/src/org/jruby/Ruby.java	2015-04-27 16:19:07.409071162 -0400
+++ jruby-1.5.1/src/org/jruby/Ruby.java	2015-04-27 16:19:07.401071161 -0400
@@ -267,6 +267,8 @@
         this.beanManager        = BeanManagerFactory.create(this, config.isManagementEnabled());
         this.jitCompiler        = new JITCompiler(this);
         this.parserStats        = new ParserStats(this);
+
+	this.hashSeed = this.random.nextInt();
         
         this.beanManager.register(new Config(this));
         this.beanManager.register(parserStats);
@@ -3693,6 +3695,10 @@
     public Set<Script> getJittedMethods() {
         return jittedMethods;
     }
+
+    public int getHashSeed() {
+        return hashSeed;
+    }
     
     public ExecutorService getExecutor() {
         return executor;
@@ -3762,6 +3768,8 @@
     private long randomSeed = 0;
     private long randomSeedSequence = 0;
     private Random random = new Random();
+    /** The runtime-local seed for hash randomization */
+    private int hashSeed = 0;
 
     private final List<EventHook> eventHooks = new Vector<EventHook>();
     private boolean hasEventHooks;  
Index: jruby-1.5.1/src/org/jruby/RubyString.java
===================================================================
--- jruby-1.5.1.orig/src/org/jruby/RubyString.java	2015-04-27 16:19:07.409071162 -0400
+++ jruby-1.5.1/src/org/jruby/RubyString.java	2015-04-27 16:19:07.405071162 -0400
@@ -91,6 +91,7 @@
 import org.jruby.runtime.marshal.UnmarshalStream;
 import org.jruby.util.ByteList;
 import org.jruby.util.ConvertBytes;
+import org.jruby.util.MurmurHash;
 import org.jruby.util.Numeric;
 import org.jruby.util.Pack;
 import org.jruby.util.Sprintf;
@@ -1024,11 +1025,11 @@
     }
 
     private int strHashCode(Ruby runtime) {
+        int hash = MurmurHash.hash32(value.getUnsafeBytes(), value.getBegin(), value.getRealSize(), runtime.getHashSeed());
         if (runtime.is1_9()) {
-            return value.hashCode() ^ (value.getEncoding().isAsciiCompatible() && scanForCodeRange() == CR_7BIT ? 0 : value.getEncoding().getIndex());
-        } else {
-            return value.hashCode();
+            hash ^= (value.getEncoding().isAsciiCompatible() && scanForCodeRange() == CR_7BIT ? 0 : value.getEncoding().getIndex());
         }
+        return hash;
     }
 
     @Override
