There were some quick, dirty tests for some of these answers. (These results may not be exactly the same with your version of Ruby, weird caching, etc., but the overall results will be similar.)
arr is a collection of ActiveRecord objects.
Benchmark.measure { 100000.times { Hash[arr.map{ |a| [a.id, a] }] } }
Benchmark @real = 0.860651, @cstime = 0.0, @cutime = 0.0, @stime = 0.0, @utime = 0.8500000000000005, @total = 0.8500000000000005
Benchmark.measure { 100000.times { h = Hash[arr.collect { |v| [v.id, v] }] } }
Benchmark @real = 0.74612, @cstime = 0.0, @cutime = 0.0, @stime = 0.010000000000000009, @utime = 0.740000000000002, @total = 0.750000000000002
Benchmark.measure { 100000.times { hash = {} arr.each { |a| hash[a.id] = a } } }
Benchmark @real = 0.627355, @cstime = 0.0, @cutime = 0.0, @stime = 0.010000000000000009, @utime = 0.6199999999999974, @total = 0.6299999999999975
Benchmark.measure { 100000.times { arr.each_with_object({}) { |v, h| h[v.id] = v } } }
Benchmark @real = 1.650568, @cstime = 0.0, @cutime = 0.0, @stime = 0.12999999999999998, @utime = 1.51, @total = 1.64
Finally
Just because Ruby is expressive and dynamic does not mean that you should always look for the most suitable solution. The main loop was the fastest in creating a hash.