2012-08-29 2 views
3
# pry/irb example #1 
"abc".hash 
=> -1883761119486508070 
"abc".hash 
=> -1883761119486508070 

# pry/irb example #2 
"abc".hash 
=> -4309321811150053495 
"abc".hash 
=> -4309321811150053495 

hash 값은 특정 호출에 대해 일정하지만 호출마다 다릅니다. 왜? 디자인에 의한 것인가? 이것이 "좋은 것"으로 간주됩니까?Ruby의 해시 방법이 달리 실행되는 이유는 무엇입니까?

나는 ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]을 실행 중입니다.

답변

7

http://patshaughnessy.net/Ruby-Under-a-Microscope-Rough-Draft-May.pdf

의 23 페이지에 따르면 다음 문자열과는 다르게 작동 배열의 ... [중략] ... 루비의 해시 함수가 실제로 작동하는 방법. 이 경우 Ruby는 실제로 문자를 배열의 문자열 또는 요소에있는 전체를 반복하고 누적 해시 값을 계산합니다. 이렇게하면 해시 값이 문자열이나 배열의 모든 인스턴스에 대해 항상 동일하게되며 문자열이나 배열의 값이 변경되면 항상 변경됩니다.

그리고는 :

또한, 루비 1.9 루비 2.0 당신이 루비를 다시 시작할 때마다 다시 초기화하는 난수 초기 값을 사용하여 MurmurHash를 초기화합니다. 즉, Ruby를 중지했다가 다시 시작하면 은 동일한 입력 데이터에 대해 다른 해시 값을 얻게됩니다. 또한 직접 시도해도된다는 의미입니다. 위와 다른 값을 얻을 수 있습니다. 그러나 해시 값은 항상 동일한 Ruby 프로세스 내에서 이됩니다.

+0

해시를 생성 할 때 임의의 시드가 보안을 위해 더 좋습니다. 나는 내가 이것을 보았던 곳을 기억할 수 없다. 그러나 이것이 거의 확실한 이유 다. –

+1

다음은 공식적인 취약성 게시판의 링크입니다 http://www.ruby-lang.org/ko/news/2011/12/28/denial-of-service-attack-was-found-for-rubys-hash -algorithm-cve-2011-4815 / – Yossi