>Java >java지도 시간 >Java가 문자열의 hashCode()에서 승수로 31을 사용하는 이유는 무엇입니까?

Java가 문자열의 hashCode()에서 승수로 31을 사용하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-19 17:07:10901검색

여기서 s[i]는 문자열의 i번째 문자를 나타내고, n은 길이이고 ^는 지수를 의미합니다. 그러나 적절한 질문이 생깁니다. 배수가 왜 31로 설정되어 있습니까?Why Does Java Use 31 as the Multiplier in String's hashCode()?

이 선택은 Joshua Bloch의 유명한 저서 "Effective Java, Second Edition"에 설명된 원칙에서 비롯됩니다. Bloch의 이론적 근거는 승수에 대한 두 가지 주요 기준에 중심을 두고 있습니다. 즉, 상대적으로 큰 소수여야 합니다.

홀수 소수 승수의 이점

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Bloch는 31과 같은 홀수 소수 승수는 곱셈 연산이 오버플로로 인해 정보 손실을 초래하지 않도록 보장합니다. 승수가 짝수이면 오버플로가 발생할 수 있고, 2를 곱하는 것은 이동과 유사하므로 중요한 정보가 손상될 수 있습니다.

소수 승수의 미묘함

소수 승수 선택의 구체적인 이점은 덜 분명하지만 이는 관례적인 관행과 일치합니다. 특히 31은 고유한 속성을 가지고 있습니다. 즉, 곱셈을 쉬프트 및 뺄셈으로 효율적으로 대체할 수 있어 성능이 향상됩니다. 이 최적화는 최신 가상 머신(VM)에 의해 자동으로 실행되는 경우가 많습니다.

합의

요약하면 Java는 String의 hashCode() 메소드에 대한 승수로 31을 사용합니다. 홀수 소수로서의 상태에서 비롯됩니다. 이 선택은 오버플로로 인한 정보 손실을 방지하고 곱셈을 이동 및 빼기로 대체하여 성능을 향상시킵니다.

위 내용은 Java가 문자열의 hashCode()에서 승수로 31을 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.