aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
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 /activerecord/lib/active_record
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.
Diffstat (limited to 'activerecord/lib/active_record')
-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