재귀적 n‑gram 해싱은 쌍‑독립성까지만 보장한다… 그 이유와 대안
📝 Abstract
Many applications use sequences of n consecutive symbols (n-grams). Hashing these n-grams can be a performance bottleneck. For more speed, recursive hash families compute hash values by updating previous values. We prove that recursive hash families cannot be more than pairwise independent. While hashing by irreducible polynomials is pairwise independent, our implementations either run in time O(n) or use an exponential amount of memory. As a more scalable alternative, we make hashing by cyclic polynomials pairwise independent by ignoring n-1 bits. Experimentally, we show that hashing by cyclic polynomials is is twice as fast as hashing by irreducible polynomials. We also show that randomized Karp-Rabin hash families are not pairwise independent.
💡 Analysis
**
1. 연구 배경 및 필요성
- n‑gram은 검색, 언어 모델, 표절 탐지 등 다양한 분야에서 핵심 데이터 구조이며, 그 수가 수백만~수천만에 달할 수 있다.
- 해시 충돌 확률을 낮추고, 해시값을 통계적 추정(예: distinct‑n‑gram 수) 등에 활용하려면 통계적 독립성이 필수이다.
- 전통적인 Karp‑Rabin(정수 나눗셈) 해시는 재귀적이라 빠르지만, 독립성 보장이 약해 보안·통계적 정확도에 한계가 있다.
2. 주요 이론적 기여
| 항목 | 핵심 정리 | 의미 |
|---|---|---|
| 재귀적 해시의 한계 (§3) | 재귀적 해시 패밀리는 쌍‑독립을 초과할 수 없으며, 3‑wise trailing‑zero 독립성도 불가능 | 어떤 형태의 롤링 해시라도 고차 독립성을 기대하면 설계 자체가 불가능함을 증명 |
| 무작위 Karp‑Rabin (§5) | B가 짝수/홀수, n의 짝/홀에 따라 균등 여부가 달라지며, 쌍‑독립은 절대 불가 | 실무에서 널리 쓰이는 Java String.hashCode 등은 통계적 보장이 약함 |
| 불가약 다항식 해시 (GENERAL) (§7) | p(x) 가 불가약이면 GF(2) |
📄 Content
n‑그램과 해시 함수에 대한 개요
n‑그램은 알파벳 Σ 로부터 연속적으로 추출된 n개의 기호(문자)들의 시퀀스를 의미한다. n‑그램 해시 함수 (h)는 n‑그램을 ([0,2^{L})) 구간의 정수로 매핑한다. 이러한 함수들은 전체 텍스트 매칭[1][2][3], 패턴 매칭[4], 언어 모델[5‑11]부터 표절 탐지[12]에 이르기까지 다양한 분야에서 활용된다.
해시 알고리즘이 제대로 동작한다는 것을 증명하려면, 일반적으로 해시값이 일정한 통계적 성질을 만족해야 한다. 예를 들어, 모든 n‑그램을 하나의 정수로 매핑하는 해시 함수는 실용적이지 않다. 하지만 단일 해시 함수는 결정적(deterministic)이다: 같은 n‑그램은 언제나 같은 해시값을 만든다. 따라서 입력 데이터를 고의적으로 선택하면 해시값이 편향될 가능성이 있다. 이를 방지하기 위해 우리는 해시 함수들의 집합 (H) 중에서 무작위로 하나를 선택한다[13].
1. 균등성, 쌍독립성, k‑wise 독립성
균등성(Uniformity) : (H)가 L‑비트 균등이라는 것은, 임의로 선택된 (h\in H)에 대해 모든 n‑그램 (x)와 모든 해시값 (y)에 대해
[ \Pr[h(x)=y]=\frac{1}{2^{L}} ]
가 성립한다는 뜻이다. 이 조건은 매우 약한데, 상수 함수 집합 ({h(x)=c})도 균등하다고 할 수 있다.쌍독립성(Pairwise Independence) : 두 개의 서로 다른 n‑그램 (x_{1},x_{2})에 대해
[ \Pr[h(x_{1})=y\land h(x_{2})=z]=\Pr[h(x_{1})=y]\Pr[h(x_{2})=z]=\frac{1}{2^{2L}} ]
가 모든 (y,z)에 대해 성립하면, (H)는 쌍독립이라고 부른다. 쌍독립이면 자동으로 균등성을 만족한다.k‑wise 독립성 : 서로 다른 (x_{1},\dots ,x_{k})와 임의의 해시값 (y_{1},\dots ,y_{k})에 대해
[ \Pr\bigl[h(x_{1})=y_{1}\land\cdots\land h(x_{k})=y_{k}\bigr]=\frac{1}{2^{kL}} ]
가 성립하면 (H)는 k‑wise 독립이다. k‑wise 독립이면 ((k-1))-wise 독립과 균등성을 모두 포함한다. 완전 독립(fully independent)인 경우는 임의의 큰 (k)에 대해서도 k‑wise 독립성을 가진다. 실제 응용에서는 데이터 소스의 엔트로피가 충분히 높을 경우, 완전 독립이 아니더라도 충분히 좋은 성능을 보일 수 있다[16].
2. 재귀적(롤링) 해시 함수
해시 함수 (h)가 재귀적(recursive) 혹은 롤링(rolling) 이라고 하면, 어떤 함수 (F)가 존재하여
[
h(x_{2},\dots ,x_{n+1}) = F\bigl(h(x_{1},\dots ,x_{n}),,x_{1},,x_{n+1}\bigr)
]
를 만족한다는 뜻이다. 이상적으로는 (F)를 (O(L)) 시간에 계산할 수 있기를 원한다; (O(Ln)) 시간에 계산한다면 재귀적이라는 장점이 사라진다.
논문의 주요 기여
- 재귀적 해시 함수는 쌍독립보다 더 강한 보장을 제공하지 못한다 (섹션 3).
- 무작위화된 Karp‑Rabin 해시는 균등할 수는 있지만 절대 쌍독립은 될 수 없음을 증명한다 (섹션 5).
- 불가약(irreducible) 다항식에 기반한 해시는 쌍독립임을 보인다 (섹션 7).
- 순환(cyclic) 다항식에 기반한 해시는 균등조차 만족하지 않음을 보인다 (섹션 9).
- 순환 다항식 해시는 n‑1개의 연속 비트를 무시하면 쌍독립성을 얻는다 (섹션 10).
실험 결과, 순환 다항식 기반 해시가 불가약 다항식 기반 해시보다 속도가 빠름을 확인하였다. 표 1은 논문에서 제시한 알고리즘들의 특성을 요약한다.
3. 해시값의 뒤쪽 0(Trailing‑Zero) 독립성
일부 무작위 알고리즘[14,15]은 뒤쪽 0의 개수가 독립적이면 충분하다. 예를 들어, 대용량 문서에서 서로 다른 n‑그램의 개수를 직접 열거하지 않고도, 해시값들의 앞쪽 0 개수를 이용해 추정할 수 있다[19].
- zeros(x) : 정수 (x)의 이진 표현에서 뒤쪽에 연속된 0의 개수를 반환한다 ((0\le\text{zeros}(x)\le L,\ \text{zeros}(0)=L)).
- k‑wise trailing‑zero independence : 임의의 서로 다른 n‑그램 (x_{1},\dots ,x_{k})에 대해
[ \Pr\bigl[\text{zeros}(h(x_{1}))=z_{1},\dots ,\text{zeros}(h(x_{k}))=z_{k}\bigr]=\frac{1}{2^{kL}} ]
가 성립한다는 의미이다.
k‑wise 독립이면 자동으로 k‑wise trailing‑zero 독립이지만, 그 역은 성립하지 않는다. 예를 들어, 해시값을 오른쪽으로 이동시켜 가장 오른쪽 1 앞의 모든 비트를 0으로 만드는 변환 (g)를 적용하면, (g\circ h)는 trailing‑zero 독립하지만 균등성조차 만족하지 않는다.
정리 1
3‑wise trailing‑zero 독립성을 가지면서 동시에 재귀적인 해시 함수는 존재하지 않는다.
증명(요약): n + 2‑그램 “a n bb”를 고려한다. 재귀적이면서 3‑wise trailing‑zero 독립성을 가정하면, 두 n‑그램 사이의 충돌 확률이 (\frac{1}{2^{L}})보다 커야 하는데 이는 모순이다. 따라서 such a function does not exist.
4. 독립적인 해시를 만드는 간단한 방법
가장 직관적인 방법은 각 입력값마다 무작위 정수를 할당하는 것이다. 하지만 이는 모든 가능한 값에 대해 완전한 인덱스를 유지해야 하므로 메모리와 연산량이 크게 늘어난다.
다차원 상황에서는 다음과 같은 전략이 유용하다.
- 각 차원 (i)에 대해 독립적인 해시 함수 (h_{i}:K_{i}\rightarrow[0,2^{L}))를 만든다.
- 여러 차원의 해시값을 XOR 연산으로 결합한다.
이 방식은 3‑wise 독립을 보장하지만, 4‑wise 독립은 보장하지 않는다(예: n‑그램 {ac, ad, bc, bd}의 XOR은 항상 0).
5. 무작위화된 Karp‑Rabin 해시
Karp‑Rabin 문자열 매칭 알고리즘[21]에 기반한 해시 함수는
[
h(x_{1},\dots ,x_{n})=\sum_{i=1}^{n} x_{i},B^{,n-i}
]
와 같이 정의된다. 여기서 (B)는 정수이다. Java String.hashCode()는 (L=32,\ B=31)을 사용한다[22]; 교과서에서는 (B=37)을 권장한다[23].
무작위화된 버전은 다음과 같이 정의한다.
- 기호마다 무작위인 기본 해시 (h_{1})를 만든다 ((h_{1})는 ([0,2^{L}))에서 균등).
- 고정된 정수 (B)를 사용해
[ h(x_{1},\dots ,x_{n}) = \bigl(\sum_{i=1}^{n} h_{1}(x_{i}),B^{,n-i}\bigr)\bmod 2^{L} ]
로 계산한다.
이 알고리즘은 각 해시값을 (O(M(L))) 시간에 계산한다. 여기서 (M(L))은 (L)‑비트 정수 곱셈 비용이다. 대부분의 실제 환경에서는 (L)비트가 하나의 머신 워드에 들어가므로 곱셈 비용을 상수로 볼 수 있다.
정리 2 (무작위 Karp‑Rabin 해시의 성질)
균등성:
- (B)가 짝수이면 모든 (n)에 대해 균등한다.
- (B)가 홀수이고 (n)이 홀수이면 균등한다.
- (B)가 홀수이고 (n)이 짝수이면 균등하지 않다.
쌍독립성: 어떤 (B)와 (n\ge2)에 대해서도 절대 쌍독립이 될 수 없다.
따라서 무작위 Karp‑Rabin 해시는 2‑universal조차 만족하지 않는다(2‑universal는 모든 서로 다른 입력쌍에 대해 충돌 확률이 (\le 1/2^{L})인 성질).
6. 다항식 기반 재귀 해시
이 절에서는 이진 갈루아 필드 GF(2) 를 이용한 해시 기법을 다룬다. GF(2)에서는
- 덧셈 = XOR (
⊕) - 곱셈 = AND (
∧)
이며, 다항식 (p(x)\in GF(2)[x]) 로 정의된 모듈러 연산 (GF(2)[x]/p(x)) 를 사용한다.
6.1 기본 연산
| 연산 | 설명 |
|---|---|
| 다항식 (\sum_{i=0}^{L-1} q_i x^i) | L‑비트 정수 (\sum_{i=0}^{L-1} q_i 2^{i}) 로 표현 |
| 덧셈/뺄셈 | 두 L‑비트 정수의 XOR |
| 곱셈 (다항식에 (x) 곱) | 마지막 비트가 0이면 단순 좌측 시프트, 1이면 좌측 시프트 후 다항식 (p(x))와 XOR |
이 세 연산만으로 GF(2)[x]/p(x) 위의 모든 연산을 정수 연산으로 구현할 수 있다.
6.2 해시 함수 정의
임의의 독립적인 L‑비트 해시 함수 (h_{1})가 주어졌다고 하자. 각 문자 (c)에 대해 (h_{1}(c))를 다항식으로 해석하고, 차수가 (\ge n)인 다항식 (p(x))를 선택한다면 다음과 같이 재귀적 해시를 정의한다.
[ H = \bigl(\sum_{i=1}^{n} h_{1}(a_i),x
이 글은 AI가 자동 번역 및 요약한 내용입니다.