- Hash Function Prospector는 정수 해시 함수를 무작위로 대량 생성하고 JIT 컴파일해 avalanche 동작을 평가한 뒤, 현재 최적 함수를 C 문법으로 출력하는 도구임
- 평가는 단일 입력 비트를 뒤집었을 때 평균적으로 고정된 채 남는 출력 비트 수인 avalanche score를 사용하며, 낮을수록 좋고 이상적인 값은 0임
- 탐색 대상은 32비트와 64비트 정수 해시 함수이며, JIT 컴파일러 때문에 도구 실행은 x86-64만 지원하지만 발견된 함수는 다른 환경에서도 사용할 수 있음
- 발견된 주요 함수들은 xorshift-multiply-xorshift 구성을 쓰며, 2라운드
lowbias32는 MurmurHash3 32-bit finalizer보다 작은 차이로 낮은 bias를 보이고 3라운드triple32는 이론적 bias 한계에 가까움 - 정확한 bias 측정은 32비트 함수에 대해
-E와-e로 수행할 수 있고, 16비트 해시는 별도 도구hp16이 담당하며 C 정수 승격 규칙에 주의해야 함
Hash Function Prospector의 역할
- Hash Function Prospector는 자동화된 정수 해시 함수 발견 도구임
- 무작위로 수십억 개의 정수 해시 함수를 생성하고, 이를 JIT 컴파일한 뒤 avalanche 동작을 평가함
- 생성된 함수 중 현재 가장 좋은 함수는 C 문법으로 출력됨
- 관련 글로 Prospecting for Hash Functions가 연결되어 있음
평가 기준과 지원 범위
- avalanche score는 입력 비트 하나를 뒤집었을 때 평균적으로 고정된 채 남는 출력 비트 수임
- 점수가 낮을수록 좋음
- 이상적으로는 모든 출력 비트가 50% 확률로 뒤집혀 score가 0이 됨
- Prospector는 32비트와 64비트 정수 해시 함수를 생성할 수 있음
- 전체 옵션은
-h사용법에서 확인하도록 되어 있음 - JIT 컴파일러 때문에 도구 자체는 x86-64만 지원함
- 다만 발견된 해시 함수는 어디서든 사용할 수 있음
탐색에 쓰는 가역 연산
- 생성기는 선택된 9가지 가역 연산에서 함수를 무작위 구성함
- 연산 목록은 다음과 같음
x = ~xx ^= constantx *= constant | 1x += constantx ^= x >> constantx ^= x << constantx += x << constantx -= x << constantx <<<= constantx = bswap(x)
- 기술적으로
x = ~x는x ^= constant로 표현 가능하지만, 해당 XOR 상수를 생성기가 우연히 고를 가능성이 낮아 별도 연산으로 취급함
발견된 32비트 해시 함수
-
2라운드 함수
- 유용한 발견 함수군 중 하나는 2라운드 xorshift-multiply-xorshift 구성임
- TheIronBorn은 조합 최적화를 사용해 이 구성의 알려진 최적 파라미터를 찾았고, 결과는
[16 21f0aaad 15 d35a2d97 15] = 0.10760229515479501임 lowbias32는 32비트 2라운드 순열로, bias가 낮고 MurmurHash3 32-bit finalizer보다 아주 작은 차이로 더 낮은 bias를 보임lowbias32의 exact bias는0.17353355999581582- 구성은 Prospector가 발견했고, 파라미터는 hill climbing과 유전 알고리듬으로 조정됨
- 역함수
lowbias32_r도 제공됨 prospector32는 Prospector만 사용해 발견된 함수임- exact bias는
0.34968228323361017 - 앞의
lowbias32보다 bias가 더 큼 - 대체 곱셈 상수를 무작위 탐색하려면 다음처럼 패턴을 지정함
./prospector -p xorr:15,mul,xorr:12,mul,xorr:15
-
3라운드 함수
- 같은 구성에 multiply-xorshift 라운드를 하나 더 추가하면 신중히 고른 파라미터로 이론적 bias 한계에 도달할 수 있음
triple32는 exact bias가0.020888578919738908임- README는 이를 모든 32비트 정수의 무작위 순열 같은 완전한 PRF와 구분할 수 없다고 설명함
- 역함수
triple32_r도 제공됨 - 3라운드 상수 목록에는
0.020888578919738908부터 약0.022984943828687553까지 낮은 bias 결과들이 포함됨 triple32앞에 증가 연산을 붙인triple32inc는hash(0) = 0문제를 깨고 bias도 조금 더 낮춤- exact bias는
0.020829410544597495 - 역함수
triple32inc_r는 마지막에x--를 수행함
exact bias 측정
-E모드는 주어진 해시 함수의 bias를 평가함- 기본적으로 Prospector는 bias를 빠르게 평가하기 위해 추정치를 사용함
- 이 추정은 비결정적이며 결과에 노이즈가 많음
- 완전 탐색으로 exact bias를 측정하려면
-e옵션을 사용함 - 검사할 함수는 두 방식으로 정의할 수 있음
-p와 패턴으로 정의-l과hash()함수를 포함한 공유 라이브러리로 정의
- 공유 라이브러리 방식은 Prospector의 제한된 함수 표현으로 나타낼 수 없는 해시 함수도 테스트할 수 있게 함
- 기본 입력은 32비트 해시 함수로 취급됨
-8스위치는 64비트 함수를 추정 방식으로 테스트함- 64비트 해시 함수는 시간이 너무 오래 걸려 exact exhaustive test가 없음
16비트 해시용 hp16
- 16비트 해시는 제약이 달라 별도 도구
hp16이 제공됨 hp16은 32비트·64비트 Prospector와 달리 완전히 이식 가능하며 거의 모든 시스템에서 실행될 수 있음hp16은 128KiB s-box 생성과 평가도 가능함- 16비트 해시가 빠른 곱셈 명령이 없는 기계에서 필요할 수 있기 때문에, 탐색 중 특정 연산을 생략하는 옵션도 있음
-m-r
16비트 결과와 C 구현 주의점
- 현재까지의 16비트 결과 예시는 다음과 같음
- 2라운드 xorshift-multiply
hash16_xm2: bias0.0085905051336723701 - 3라운드 xorshift-multiply
hash16_xm3: bias0.0045976709018820602 - 곱셈 없는
hash16_s6: bias0.023840118344741465
- 2라운드 xorshift-multiply
- 곱셈 없는
hash16_s6는 특정 xorshift-multiply 형태와 동일하다고 제시됨 hp16 -Xn3로 짧게 탐색한 좋은 3라운드 xorshift 해시는hp16 -S의 좋은 s-box에 가까운 근사임- 16비트 연산을 C로 작성할 때는 정수 승격 규칙에 주의해야 함
- 예를 들어 32비트 구현에서는 unsigned 16비트 피연산자가 signed 32비트 정수로 승격될 수 있음
- 이 경우 특정 상황에서 잘못된 결과가 나올 수 있음
- 이 프로그램이 출력하는 C 코드는 필요한 곳에서 16비트 연산을
unsigned int로 승격하도록 주의함