리졸버 라이브러리의 XPath에서 BS4 및 pyquery

  해시 원칙 및 세계의 구현

  1 해시 해시 소개

  2 유니버설 글로벌 해시 해시

  \ mathcal {H} H 글로벌 해시 H를 구성 -3-

  4- 파이썬 달성

  1 해시 해시 소개

  해시 함수 Y = H (k)를 Y = H (k)를 Y = H (k)는, 고정 길이의 출력에 해시 알고리즘 HHH의 YYY를 통해 임의의 길이 KKK의 입력, 출력 해쉬 값은 1이다. 일반적인 해시 함수 H, Y는 (K) = (a⋅k + B)는 제 = H (K) = (a \ cdot K + b) \ 개조 내 = H (K) = (a⋅k를 개조 =이고 + b) modm은 일반적으로 소수를 음.

  아래와 같이, 충돌 해시 함수 경향이 있으므로 | K | |> | Y | | K |> | Y | | K |> | Y 도메인 해시 함수 YYY 범위이며, 일반적으로, KKK 제공된다 H (K5) = H (K2) = H (K7) H (k_5) = H (k_2) = H (k_7) H (K5) = H (K2) = H (K7), K5, K2, k7k_5, k_2 , k_7k5, K2, K7 체인 (충돌) 중 :

  해쉬 함수를 들어, 때로는, 그래서 자신의 해시 값이 동일한 지, 입력의 집합을 찾을 체인에 그들을 선도하고, 기본적으로 할 수는 선형 복잡성 때문에 더 선형에 비해 해시 조회 시간보다, 더 높은 것보다 보이는 .

  2 유니버설 글로벌 해시 해시

  아이디어 : 문제를 해결하는 한 가지 방법은 무작위입니다. 해시 함수의 세트로부터 무작위로 선택 (해시 함수를 가정). 그래서 해시 함수는 매우 낮은 효율성 것을 특정 해시 함수에 대한 입력의 세트를 구성하는 다른 방법이 없다, 선택합니다.

  1 정의 : {H} H는 해시 함수의 집합이다 U \ mathcal {U} U가 정의 도메인은, H는 \ mathcal, U \ mathcal {U}가 U는 0, 1, ..., m-1 {매핑된다 수 } \ {0, 1, ..., m-1 \} {0,1, ..., m-1}, 즉 H : U → {0,1, ..., m-1}, 시간 ∈Hh : \ mathcal {U} \ 향하는 화살표 \ {0, 1, ..., m-1 \} H \에서 \ mathcal {H} H : U → {0,1, ..., m-1 }, h∈H.

  정의 2 : ∀x 경우, Y \ FORALL X, y∀x는 Y가 X ≠ 만족 YX \ NEQ yx = Y 및 | {h∈H : H (X) = H (Y)} | = | H | m | \ {H \에서 \ mathcal {H} H (X) = H (Y) \} | = \ FRAC {| \ mathcal {H} |} {m} | {h∈H : H (X) = H (Y)} | = m은 | H는 | 불리는 H \ mathcal {H} H가 전역 (범용)이다.

  h는 H의 균일 mathcal {H} H 선택 \ (각 입력 해시 함수를 재 - 선택 참고) YYY 후 XXX 충돌 확률과 임의로 정의 경우 약 2이다 :

  함수 H (X) = H (Y)의 수는 모두의 함수 = | H | m | H는 |. = 1m \} {FRAC {함수 H (X) = H (Y)의 수는 모두의 함수이다}

  = \ FRAC {\ FRAC {| \ mathcal {H} |} {m}} {| \ mathcal {H} |}. = \ FRAC {1} {m} 모든 함수 H (X) = H (Y) 기능 번호 = | H | m | H | = M1.

  정리 1 : 균일 \ mathcal {H} H (H \ mathcal {H} H는 전체 도메인이다) 우리는 이제 다음의 TTT의 해시 테이블에 NNN 입력 넣으면 HHH 선택된주는 H 임의로 , XXX 입력이

  E [X 해시 테이블에 충돌 T 소자의 수]

  상기 E [⋅] E [\ cdot] E [⋅] 기대 나타낸다.

  {H} H는 (평균 의미에서) 해시 테이블 TTT에서 전체 필드 요소의 최종 분포가 균일 mathcal \가 H 경우 [정리 1의 중요성] 정리 위의 증명에 의해, 우리는 말할 수있다.

  정리 1하자 CxC_의 증거 {X}를 제공 CX, 해시 테이블 및 XXX TTT 충돌 랜덤 요소의 수를 나타낸다

  CXY = \ \ 왼쪽 따라 광고 = {H (X) = H (Y) 0if H (X) ≠ H (Y) C_ {XY {}}} {{CR 어레이를 시작 \

  1 \ H (X) = H (Y)의 경우 \\

  0 \ H (X) \ NEQ H (Y)의 경우,

  \ {말단 배열} \ {10if right.Cxy = H (X) = H (Y)의 경우, H (X) = H  (Y)

  음,

  E [CX] = E [Σy∈T-xCxy = Σy∈T XE-[CXY] 선형성 Σy∈T = - = x1m의 원하는 특성 이후 (N-1) 1m

  E [C_x] = E [\ sum_ {텍사스 Y \} C_ {XY}] \\

  앤 = \ {Sum_ 텍사스 Y \} E [C_ {XY}] 원하는 선형 특성 때문에 \\

  & = \ sum_ {텍사스 Y \} \ FRAC {1} {m}을 \\

  & = (N-1) \ FRAC {1} {m} \\

  및 <\ FRAC {N} {m}.

  \ 단부 {} 배열 E [CX] = E [Σy∈T-xCxy = Σy∈T XE-[CXY = Σy∈T-XM1 = (N-1) M1

  예 : 또한, n = 1, m = 2N = 1, m = 2N = 1, m = 2, 그때 E [CX] <12.E [C_x] <\ FRAC {1} {2} 전화부 [CX] < (21).

  \ mathcal {H} H 글로벌 해시 H를 구성 -3-

  정리 2 : 다음 4 단계 구성 H \ mathcal {H}에 따라 H는 모든 필드이다 :

  (조건) 주문 음은 소수에 동일;

  (초기 제제) 입력 KKK 기록 R + 1R + 1R + 1 자리 : K = K = K = 여기서 ki∈ {0,1, ..., m-1} k_i \에서 \ {0, 1, ..., m-1 \ ki∈} {0,1, ..., m-1} (16 진법 동등 KKK 음에 의해);

  (임의의) 랜덤 선택하는 A = A = A =있어서 ai∈0,1, ..., m-에 1a_i \ {0, 1, ..., m-1} ai∈0,1 .. ., m-1;

  (해시 函数 11A) (K) = (Σi = 0I = 라이 × KI) 개조 mh_a (K) (\ sum_ {I 0 =} ^ {내가 = R} A_I \ 시간 k_i) = \ 개조 MHA (K) = (Σi = 0I 라이 = KI ×) modm.

  이 증거를 참조하십시오.

  4- 파이썬 달성

  잘못 보면 자신의 코드를 작성하기 위해, 저를 수정합니다. 코드 링크 : https를 다음과 같이 //github.com/VFVrPQ/LDP/blob/master/Components/UniversalHashing.py, 그렇지 않으면 전체 코드는 다음과 같습니다

  수입 수학

  수입 무작위

  클래스 유니버설 해싱 :

  '' '

  g : 주요

  D : 도메인 [0, 1, ..., D-1]

  렌 : g의 자료 자릿수의 최대 수

  V :의 입력 값을 [0, 1, ..., D-1]

  해시 함수 : H_A (A) = (a (0) * K (0) + A (1) * K (1) + ... + A (AS-1) * K (단-1)) % g

  '' '

  DEF __ (자기, g, d) __init :

  자기 .__ g = g

  어설 g> = 2 ', g 미만 2'

  어설 션 자기 .__ isPrime (g)을, 'g는 소수 아니다'

  자기 .__ D = D

  자기 .__ LEN = math.ceil (math.log (d) / math.log (g)) # g 대역 비트의 최대 개수

  자기 .__ A = 자기 .__ LEN * [0] # 초기 길이

  V는 #의 입력 값을 [0, 1, ..., D-1]

  데프 해시 (자기, V) :

  자기 랜덤 .__ () 재생성 # A, 선택 H

  아웃 = self.calc (자기 .__ A, V)

  반환 자기 .__ A, 밖으로

  CALC H_A 번호 (K) = (a (0) * K (0) + A (1) * K (1) + ... + A (AS-1) * K (단-1)) % g

  데프 CALC (자동, A, V) :

  어설 만의 (a) == 자기 .__ 만 "단지 (A)! =에만 자기 .__ '

  K = 자기 .__ toBitList (V)

  아웃 = 0 돈이 얼마나 정주 낙태를 http://mobile.sgyy029.com/

  전 범위 (자기 .__ 렌) 대 :

  % 자기 .__ g (a [I] * (k)를 [I] + 아웃) = 아웃

  밖으로 돌아

  데프 __randomness (자기) :

  # 생성

  전 범위 (자기 .__ 렌) 대 :

  자기 .__ A [i]를 random.randint = (0, 자기 .__ g-1)

  데프 __toBitList (자기, V) :

  어설 V> 0 'V <0'=

  경우 V == 0 :

  창 자체 .__ LEN * [0]

  Bitliste = 자기 .__ 사람 * [0]

  전 범위 (자기 .__ 렌) 대 :

  bitList [I] = V %의 자기 .__ g

  V = INT (V / 셀프 .__ g)

  반환 Bitliste

  데프 __isPrime (자기, V) :

  V는 <= 1 인 경우 :

  반환 거짓

  대 전 범위 (2, INT (math.sqrt (V)) + 1, 1)에서 :

  I 브이 %가 0 == 경우 :

  반환 거짓

  true를 돌려줍니다

  # 테스트

  __name__ == "__main__"경우 :

  TIMES = 10

  g = 29 # 프라임

  D = 16 # 도메인

  유니버설 해싱 uhash = (g, d)

  H = g의 * [0]

  I에 대한 범위 (회)에 # 랜덤 번 확인하는

  random.randint X = (0, D-1)

  _ = uhash.hash 아웃 (X)

  H [출력] + = 1

  범위의 I (g) :

  출력 (I, H [I])


추천

출처blog.51cto.com/14503791/2484280