2017-11-12 1 views
1

Java에서 문자열 세트의 해시를 계산하고 싶습니다. 예, 문자열을 정렬하고 digest.update을 사용하여 MD5 해시 반복을 계산할 수 있습니다. 그러나 나는 종류를 생략하고이 같은 등을 묻는 비슷한 질문이 많이 Order-independant Hash Algorithm 같다하지만 그들 중 비 자바에서 반복 주문 독립적 인 해시를 계산하는 방법을 보여주는 간단한 예제를 제공 combineUnorderedhttps://github.com/google/guava/wiki/HashingExplained 같은 것을 사용하는 것을 선호 것 .Java에서 독립적 인 해시를 주문하십시오.

+0

을 youneed이 세트의 해시 알고리즘을 덮어 이유는 무엇입니까 ? –

+0

@ SzigyártóMihály 겹쳐 쓸 필요가 없습니다. 간단한 예제를 찾고 있습니다. 나는 명령에 민감한 MD5와 MurmurHash를 안다. 그러나 나는 그것을 사용하는 예를 찾을 수 없었다. –

+0

집합은 아이템의 해시 합계를 사용하며 순서에 따라 다릅니다. –

답변

3

그냥 XOR 각 해시를하고 순서가 중요하지 않으며 플러스 해시 크기가 컬렉션의 크기가 커지기보다는 고정 될 것입니다.

해시 코드는 int 자바 문자열의 해시 코드에 내장 된 사용 : 질문과 같은

int hashcode = strings.stream() 
     .mapToInt(Object::hashCode) 
     .reduce(0, (left, right) -> left^right); 

해시 코드 (Hashcode) 사용 구아바와 MD5 질문 :

Optional<byte[]> hash = strings.stream() 
     .map(s -> Hashing.md5().hashString(s, Charset.defaultCharset())) 
     .map(HashCode::asBytes) 
     .reduce((left, right) -> xor(left, right)); 


static byte[] xor(byte[] left, byte[] right) { 
    if(left.length != right.length) { 
     throw new IllegalArgumentException(); 
    } 
    byte[] result = new byte[left.length]; 
    for(int i=0; i < result.length; i++) { 
     result[i] = (byte) (left[i]^right[i]); 
    } 
    return result; 
} 
+0

이것은 선호되는 방법입니다. 해시를 XOR하는 것은 그것들을 추가하는 것보다 낫습니다. –

+0

@ Magnus 덕분에 XOR을 사용해 보겠습니다. –

1

각 문자열의 MD5 해시를 개별적으로 계산 한 다음 모두를 추가하여 단일 해시를 얻을 수 있습니다. 그것은 순서에 독립적입니다. 덧셈 연산은 교환 가능하기 때문에. 여기

은 예입니다 (우리가 가정하는 방법 md5Hex 주어진 문자열의 MD5 해시를 계산하고 16 진수 형식의 결과를 반환합니다 (문자열 STR)) :

String[] strings = {"str1", "str2", "str3", ...}; 

BigInteger hashSum = BigInteger.ZERO; 
for(String s : strings) { 
    String hexHash = md5Hex(s); 
    hashSum = hashSum.add(new BigInteger(hexHash, 16)); 
} 

String finalHash = hashSum.toString(16); 
+0

네, 고맙습니다. 질문의 배경 (비록 downwoted)이 방법으로 가야하거나 정렬되지 않은 가능성을 결합 할 수있는 몇 가지 대안 해시 알고리즘을 사용하여 충돌을 덜 받았다. –

+0

@MarmiteBomber, 예제를 추가했습니다. – elyor