aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2016-09-26 10:27:11 -0400
committerSean Griffin <sean@seantheprogrammer.com>2016-09-26 10:27:11 -0400
commita6da7938017647dd6e19e23d3d47126cb7a3e1fe (patch)
treee46c6fd36d800143321b486565ebba79a3bb1f5a
parent15a8740d68ccf1f376b5f2cf29c5336d8716278f (diff)
downloadrails-a6da7938017647dd6e19e23d3d47126cb7a3e1fe.tar.gz
rails-a6da7938017647dd6e19e23d3d47126cb7a3e1fe.tar.bz2
rails-a6da7938017647dd6e19e23d3d47126cb7a3e1fe.zip
Use xor to avoid allocations in `AR::Core#hash`
This is not as good a solution as actually hashing both values, but Ruby doesn't expose that capability other than allocating the array. Unless we were to do something silly like have a thread local array that is re-used, I don't see any other way to do this without allocation. This solution may not be perfect, but it should reasonably avoid collisions to the extent that we need.
-rw-r--r--activerecord/lib/active_record/core.rb2
1 files changed, 1 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 3465b68ac6..622df0cfc1 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -452,7 +452,7 @@ module ActiveRecord
# [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
def hash
if id
- [self.class, id].hash
+ self.class.hash ^ self.id.hash
else
super
end