2012-10-19 3 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 또는 digest는 문자열 만 처리하지만 항상 배열을 정렬하고 작업에 참여해야했습니다.

그럼 더 좋은 점이 있습니까?

답변

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"] 

해시로 유지 : 대신이 같은 배열의 당신은 설정하고 to_set 메소드를 호출하는 배열을 변환 할 수 있습니다

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

(에 foreget하지 않는`필요 '설정')

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

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

아아, 완벽한 솔루션 덕분입니다. 루비의 세트에 대해 몰랐습니다. 완벽하게 맞습니다! –

+2

보기는 쉽지만 배열 요소가 중복 될 수 있습니다. 그런 식으로'[ ','b ']'는'[ 'a', 'b', 'a']와 같습니다. – iltempo

+1

'to_set.hash' 메소드는 여기에서 사용하는 것이 신뢰할 만하고 다른 루비 1.9 버전에서는 변경되지 않습니까? –

관련 문제