2012-04-12 2 views
2

다른 개체의 두 해시를 결합하는 합법적 인 방법은 XOR을 사용하는 것입니다. 이것은 의미가 있지만 아래의 토마스 포르 넨 (Thomas Pornin)의 두 번째 주석에서 언급했듯이 XOR은 교환 적입니다. 즉, 집합의 각 요소를 해시하고 XOR과 결합하면 모든 순서에 따라 결과가 항상 달라집니다 같은 해시 :순서가 지정된 집합에 해시 합치기

Why is XOR the default way to combine hashes?

당신이 순서 의존 할 해시를 결합 할 수있는 좋은 방법은 무엇입니까? 크기와 관련이있는 경우 32 비트 및 64 비트에 대해 알려진 기술은 무엇입니까?

+0

사이드 노트, 특별한 경우에 나는 반복 변수 'i'가 0에서부터 요소 수에 이른다. 'i'를 사용하여 순서 종속적 해시를 만드는 좋은 방법이 있습니까? – Trevor

+0

순서를 지정하려면 부분 해시를 x 축으로 집계하기 전에 부분 해시를 회전 (* 이동하지 * 않음) 할 수 있습니다. 이 코스가 충돌을 일으킬 수 있다면 (H (ABCD) == H (DABC)와 같음) 게임의 일부입니다 ... – wildplasser

+0

지금 나는 거대한 소수로 '나는'곱셈을하는 바보 같은 짓을하고 있습니다. , xor 또는 모든 요소에 대한 해시를 사용합니다. 그것은 질서를 강요하지만, 나는 분명히 전문가가 아니며, 그것이 커다란 충돌을 일으키는 지 전혀 모른다. – Trevor

답변

1

결과 해시 순서에 따라 결과를 정렬하려면 알고리즘에 순차적 인 (즉, 비 정적 인) 부분이 있어야합니다. 가장 일반적인 기술은 아마도 Cyclic Redundancy Checks (CRC)입니다.

CRC는 하드웨어에서 XOR-ed 피드백이있는 시프트 레지스터로 구현 될 수 있습니다. 이러한 시프트 레지스터는 결정 론적 난수 생성기의 역할을합니다. 초기 상태가 동일하면 항상 동일한 상태 시퀀스를 통과합니다. 이러한 상태는 반복 가능한 방식으로 데이터를 XOR하기 위해 CRC 서명 계산에 사용됩니다.

두 해시 값을 결합하려면 CRC 알고리즘의 세 번째 값과 함께 XOR합니다. 이것은 table.-

인기있는 CRC 코드를 계산하거나 룩업에서 촬영 될 수 있습니다

09 bits (CRC-8) 
17 bits (CRC-16) 
33 bits (CRC-32) 
65 bits (CRC-64) 

Classless.Hasher 더 세부 사항을 제공합니다.

C# 구현은 HashLib에서 찾을 수 있습니다.

관련 문제