4

文字列でいっぱいのルビー配列のコンシステントハッシュをどのように作成できるのだろうか。要件は、配列に同じ値が含まれている場合、それらの順序に関係なく、ハッシュが常に同じであるということです。

>> a = ["a", "b", "c", "d"]
>> SomeModule.hash(a)
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
>>
>> b = ["d", "b", "c", "a"]
>> SomeModule.hash(b)
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
>>
>> SomeModule.hash(a) == SomeModule.hash(b)
=> true

Zlibまたはダイジェストは文字列のみを実行しますが、それを機能させるには、常に配列を並べ替えて結合する必要がありました。

それで、もっと良いものはありますか?

4

4 に答える 4

5

配列を Set に変換してto_setメソッドを呼び出すことができます ('require 'set' を忘れないでください)。

a = ["a", "b", "c", "d"]
a.to_set.hash # => 425494174200536878

b = ["d", "b", "c", "a"]
b.to_set.hash # => 425494174200536878
于 2012-10-19T08:21:53.113 に答える
3

配列を並べ替え、すべての要素を文字列に連結してハッシュするだけです。

def hash(array)
   Digest::SHA1.digest(array.join)
end
于 2012-10-19T08:19:02.820 に答える
0

クラスsetを導入するという標準ライブラリがすでに存在します。Setまた、自分で簡単に実装することもできます。このような配列の代わりに:

["a", "b", "c", "d"]

ハッシュとして保持します:

{"a" => true, "b" => true, "c" => true, "d" => true}
于 2012-10-19T08:21:03.123 に答える