이 질문에는 이미 답변이 있습니다.
나는 물어 보았다비슷한 질문그string.GetHashCode()
.NET의 메소드. 그때부터, 우리는 다른 머신에서 사용하기 위해 buit-in 타입에 대한 해시 코드의 암시 적 구현에 의존 할 수 없다는 것을 배웠습니다. 따라서, 나는 자바 구현을 가정하고있다.String.hashCode()
다른 하드웨어 구성에서 불안정하며 VM간에 다르게 작동 할 수 있습니다 (다른 VM 구현을 잊지 마십시오)
현재 해시 알고리즘을 사용하여 문자열을 자바로 숫자로 안전하게 변환하는 방법에 대해 논의하고 있지만 해시 알고리즘은 클러스터의 여러 노드에서 안정적이어야하며 사용 빈도가 높기 때문에 평가가 빠르다. 우리 팀 동료들은 네이티브hashCode
방법이 필요하며, 다른 접근 방식을 재고하기 위해 합리적인 논의가 필요할 것입니다. 현재, 머신 구성 (x86과 x64)의 차이점, 알고리즘이있는 머신에 따라 일부 머신 (우리의 경우에는 거의 적용 할 수 없음) 및 바이트 순서 차이에 따라 JVM의 다른 벤더 만 생각할 수 있습니다 운영. 물론 문자 인코딩도 고려해야 할 것입니다.
이 모든 것들이 내 마음 속으로 들어오지 만, 나는 그들 중 어느 누구도 강한 이유가 될 것이라고 100 % 확신하지 못하고,이 분야에서 당신의 전문화와 경험에 감사드립니다. 이렇게하면 맞춤 해싱 알고리즘을 작성하는 데 도움이되는 강력한 주장을 세우는 데 도움이됩니다. 또한, 무엇에 대한 조언을 주시면 감사하겠습니다.하지 않기그것을 구현할 때.
구현String.hashCode()
~이다.지정된문서에서 일관성이 보장됩니다.
String 객체의 해시 코드는 다음과 같이 계산됩니다.
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
int 산술을 사용합니다. 여기서 s [i]는 문자열의 i 번째 문자이고, n은 문자열의 길이이고 ^는 지수입니다. 빈 문자열의 해시 값은 0입니다.
이러한 모든 작업은 Java 용 플랫폼 독립적으로 구현됩니다. 예를 들어 플랫폼 바이트 순서는 무의미합니다.
즉,점점에이String
파일이나 다른 바이트 소스에서 가져 오는 경우 까다로울 수 있습니다. 이 경우 명시 적으로Charset
. (기억String
s은 다른 인코딩 자체가 없습니다. 인코딩은전환~ 사이byte[]
및String
.)
당신은소스 코드. 내가 볼 수있는 것부터 (10 초의 분석이 끝나면) 이것은 기계와 아키텍처간에 안정적이어야합니다. 루이는 사양을 인용하여이를 확인합니다. 스펙을 믿는다면 더 좋습니다. :-)
그러나 다른 JRE가 다르게 구현하고 스펙을 위반하는 경우에는 다를 수 있습니다.
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
String#hashCode
. - Luiggi MendozaString
클래스, 그것은 충분히 안정 보인다. 그러나 .NET에서 발생하는 것처럼 여기에 의존하지 않는 이유가 있습니다. 가상 머신, 하드웨어 차이 및 바이트 순서 또는 인코딩 종류를 염두에두면 자바 사례는 저와 매우 비슷합니다. - Ivaylo Slavov