2012-10-19 39 views
2

我想知道如何創建一個包含字符串的紅寶石數組的一致散列。要求是,如果數組包含相同的值,則散列總是相同,而與它們的順序無關。如何創建紅寶石數組的一致性哈希串?

>> 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或摘要只能做字符串,但我必須總是對數組進行排序並加入它才能工作。

那麼還有什麼更好的?

回答

1

您可以對數組進行排序,將所有元素連接到一個字符串並對其進行散列。

def hash(array) 
    Digest::SHA1.digest(array.join) 
end 
+0

謝謝,但這實際上是我想避免.. –

+0

我現在看到你最後一句話。但是我不確定如果元素順序無關緊要,你是否會進行排序。 – iltempo

+1

如果你將你的數組轉換爲一個集合,你將丟失重複元素http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.html。不知道這是你想要的。 – iltempo

1

已經有引入該Set類稱爲set標準庫。你也可以輕鬆地自己實現它。

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

保持它作爲一個哈希::不是這樣的數組的

{"a" => true, "b" => true, "c" => true, "d" => true} 
4

您可以將您的陣列設置和調用to_set方法(不foreget爲'需要「設置」)

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

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

啊,這是一個完美的解決方案,謝謝。不知道Ruby中的Set。非常適合! –

+2

看起來很簡單,但你會失去重複的數組元素。這樣''''','b']'將與'['a','b','a']'相同。 – iltempo

+1

'to_set.hash'方法在這裏使用是否可靠,並且不會因其他ruby 1.9版本而改變? –