From: "mame (Yusuke Endoh)" Date: 2013-11-28T22:53:46+09:00 Subject: [ruby-core:58662] [ruby-trunk - Bug #9172] siphash faulty on arm little endian with word align - missing code Issue #9172 has been updated by mame (Yusuke Endoh). I confirmed the issue on my BeagleBone Black. $ ./miniruby -ve 'p ["discoverer".hash, "sub-setter".hash]' ruby 2.1.0dev (2013-11-28 trunk 43540) [armv7l-linux-eabihf] [-51053038, -51053038] I think this is a bug of the siphash-c upstream: https://github.com/emboss/siphash-c/blob/master/src/siphash.c#L450 The bug was introduced by nobu, interestingly. https://github.com/emboss/siphash-c/commit/99ff3a058ffe3acc25dbadea6c053a74b73559e2 -- Yusuke Endoh ---------------------------------------- Bug #9172: siphash faulty on arm little endian with word align - missing code https://bugs.ruby-lang.org/issues/9172#change-43230 Author: prahal (Alban Browaeys) Status: Assigned Priority: High Assignee: nobu (Nobuyoshi Nakada) Category: Target version: current: 2.1.0 ruby -v: ruby 1.9.3p448 (2013-06-27 revision 41675) [arm-linux-eabihf] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN siphash.c check for "little endian+unaligned word access" and "bigendian". But my arch : armv7-a cortex a9 is little endian word aligned. This discard the loop that reduce the input below 8 bytes and a case when the leftover is four bytes. https://github.com/ruby/ruby/commit/525cb66467ff22a50f2e6bf307924459d38cd592#diff-41728f3441b348d39ebae01b3a5694a0R409 and https://github.com/ruby/ruby/commit/525cb66467ff22a50f2e6bf307924459d38cd592#diff-41728f3441b348d39ebae01b3a5694a0R446 I found this issue via bundler as it uses the hash of an array (the collision is "sub-setter".hash and "discoverer".hash has they both share all other fields (platform and version both at 0.0.2). I reported it back then as public https://github.com/bundler/bundler/issues/2724 extracts: - testcase: "collision.rb" # on arm (odroid u2) #$ ruby ~/collision.rb #708079652 #708079652 require 'rubygems' p ["discoverer", Gem::Version.new("0.0.2"), "ruby"].hash p ["sub-setter", Gem::Version.new("0.0.2"), "ruby"].hash NB: For now I rebuild with those check for UNALIGNED_WORD_ACCESS removed and at least I get way less conflict . This is no proper fix though. -- http://bugs.ruby-lang.org/