En la librería de resolución XPath, BS4 y pyquery

  principio de hash y la aplicación de mundial

  1-hash hash de Introducción

  2-Universal hash hash mundial

  3- construir un hash global H \ mathcal {H} H

  4-pitón lograr

  1-hash hash de Introducción

  función hash y = h (k) y = h (k) y = h (k), la entrada de kkk longitud arbitraria a través de un yyy hhh algoritmo de hash en la salida de longitud fija, el valor hash de salida es 1. Una función hash común es Y = H (k) = (a⋅k + b) mod mi = H (k) = (a \ cdot k + b) \ mod mi = H (k) = (a⋅k + b) MoDM, mmm generalmente el número primo.

  función hash de dominio se proporciona de KKK, gama YYY es, en general, | K |> | Y | | K |> | Y | | K |> | Y |, tan propenso a la función hash de colisiones, como se muestra abajo, 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 en una cadena (colisión):

  Para la función de hash, básicamente capaz de encontrar un conjunto de entrada, por lo que sus valores hash son los mismos, llevándolos en una cadena, e incluso a veces se ve que la complejidad lineal es aún mayor, ya que más de un tiempo de búsqueda de hash que lineal .

  2-Universal hash hash mundial

  Idea: Una manera de resolver el problema es al azar. Una selección al azar de un conjunto de funciones de hash (una familia de funciones hash). Así que elige, no hay otra manera de construir un conjunto de entradas para una función hash en particular que la función hash es muy baja eficiencia.

  Definido 1: U \ mathcal dominios {U} U se define, H \ mathcal {H} H es el conjunto de funciones de hash, se pueden U \ mathcal {U} U se asignan a {0,1, ..., m-1 } \ {0, 1, ..., m-1 \} {0,1, ..., m-1}, es decir, h: U → {0,1, ..., m-1}, h ∈Hh: \ mathcal {U} \ rightarrow \ {0, 1, ..., m-1 \}, h \ in \ mathcal {h} h: U → {0,1, ..., m-1 }, h∈H.

  Definición 2: Si ∀x, y \ forall x, y∀x, y satisface x ≠ yx \ neq yx = y y | {h∈H: h (x) = h (y)} | = | H | m | \ {h \ in \ mathcal {h}: h (x) = h (y) \} | = \ frac {| \ mathcal {h} |} {m} | {h∈H: h (x) = h (y)} | = m | h |, denominado h \ mathcal {h} h es global (universal) es.

  2 Por definición, si h es uniformemente al azar de H mathcal {H} H Seleccione \ (Tenga en cuenta que cada entrada para volver a seleccionar una función hash), entonces la probabilidad de colisión y xxx yyy son:

  El número de la función h (x) = h (y) es una función de todos = | H | m | H |. = 1 m \ {Número de la función h (x) = h (y) es una función de todos} frac {}

  = \ Frac {\ frac {| \ mathcal {H} |} {m}} {| \ mathcal {H} |}. = \ Frac {1} {m} de todas las funciones h (x) = h (y) función número = | H | m | H | = m1.

  Teorema 1: uniformemente al azar de H \ mathcal {H} H (H \ mathcal {H} H es todo el dominio) seleccionado HHH, si ahora ponemos entrada nnn en la tabla hash en el TTT, a continuación, dar una introducir xxx, hay

  E [x y el número de elementos T en las colisiones en la tabla de hash]

  En la que E [⋅] E [\ cdot] E [⋅] denota la expectativa.

  [Importancia del Teorema 1], demostrando lo anterior teorema, podemos decir que, si hay H \ mathcal {H} H es, la distribución final de los elementos en todo el campo en el TTT tabla hash (en un sentido promedio) es uniforme.

  La demostración del Teorema 1 Sea CxC_ {X} Cx representa el número de elementos aleatorios en la tabla hash y la colisión TTT xxx, siempre

  Cxy = {1 si h (x) = h (y) 0 si h (x) ≠ h (y) C_ {xy} = \ left \ {\ begin {array} {cr}

  1 y si \ h (x) = h (y) \\

  0 y si \ h (x) \ neq h (y)

  \ End {array} \ right.Cxy = {10Si h (x) = h (y) si h (x)  = h (y)

  así,

  E [Cx] = E = Σy∈T-XE Dado que las propiedades deseadas de linealidad = Σy∈T-x1m = (n-1) 1m [Σy∈T-xCxy] [Cxy]

  E [C_x] Y = E [\ sum_ {y \} en Tx C_ {xy}] \\

  & = \ Sum_ {y \ in Tx} E [C_ {xy}] y porque las propiedades lineales deseados \\

  & = \ Sum_ {y \ in Tx} \ frac {1} {m} \\

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

  Y <\ frac {n} {m}.

  \ End {array} E = E = Σy∈T-XM1 = (n-1) m1 [Cx] [Σy∈T-xCxy] = Σy∈T-XE [Cxy]

  Ejemplo: Si n = 1, m = 2n = 1, m = 2n = 1, m = 2, entonces E [Cx] <12.E [C_x] <\ frac {1} {2} .E [Cx] < 21.

  3- construir un hash global H \ mathcal {H} H

  Teorema 2: de acuerdo con el siguiente de cuatro pasos de configuración H \ mathcal {H} H es todos los campos:

  mmm (Condición) orden igual a un número primo;

  (Preparación inicial) de entrada kkk escrito r + 1R + 1R + 1 dígitos: k = k = k =, donde ki∈ {0,1, ..., m-1} K_i \ in \ {0, 1, ..., m-1 \} ki∈ {0,1, ..., m-1} (equivalente a la notación hexadecimal por kkk mmm);

  (Random) seleccionar aleatoriamente un a = a = a =, en el que ai∈0,1, ..., m-1a_i \ in {0, 1, ..., m-1} ai∈0,1, .. ., m-1;

  (Almohadilla 函数) ha (k) = (Σi = 0i = Rai × ki) mod mh_a (k) = (\ sum_ {i = 0} ^ {i = r} a_i \ veces K_i) \ mod MHA (k) = (Σi = 0i = Rai × ki) MoDM.

  Ver 2 pruebas.

  4-pitón lograr

  Para escribir su propio código, corrígeme si mirada equivocada. Código enlace: https: //github.com/VFVrPQ/LDP/blob/master/Components/UniversalHashing.py, de lo contrario el código completo es el siguiente:

  import math

  la importación al azar

  UniversalHashing clase:

  '''

  g: un primer

  d: dominio, [0, 1, ..., d-1]

  len: El número máximo de dígitos en g Base

  v: un valor de entrada en [0, 1, ..., d-1]

  función hash: H_A (a) = (a (0) * k (0) + a (1) * k (1) + ... + a (AS-1) * k (sólo-1))% g

  '''

  def __init __ (self, g, d):

  self .__ g = g

  assert g> = 2, 'g es de menos de 2'

  auto aserción .__ esPrimo (g), 'G no es un número primo'

  self .__ d = d

  El self .__ len = Math.ceil (Math.log (d) / Math.log (g)) # g-banda, el número máximo de bits

  self .__ a = self .__ len * [0] # longitud inicial

  # V es un valor de entrada en [0, 1, ..., d-1]

  def almohadilla (auto, v):

  self .__ aleatoriedad () # regenerar una, seleccione H

  fuera = self.calc (self .__ a, v)

  de retorno automático .__ un cabo

  Calc H_A # (k) = (a (0) * k (0) + a (1) * k (1) + ... + a (AS-1) * k (sólo-1))% g

  def Calc (sí, a, v):

  afirman solamente (a) == self .__ única ", sólo el (A)! = self .__ única '

  k = self .__ toBitList (v)

  fuera = 0 ¿Cuánto dinero abortos Zhengzhou http://mobile.sgyy029.com/

  para i en el rango (self .__ LEN):

  fuera = (OUT + a [i] * k [i])% self .__ g

  volver a cabo

  def __randomness (self):

  # Generar una

  para i en el rango (self .__ LEN):

  self .__ a [i] = random.randint (0, self .__ g-1)

  def __toBitList (self, v):

  assert v> = 0, 'v <0'

  si v == 0:

  de retorno automático .__ * len [0]

  Bitliste = self .__ hombre * [0]

  para i en el rango (self .__ LEN):

  bitList [i] = v% self .__ g

  v = int (v / self .__ g)

  retorno Bitliste

  def __isPrime (self, v):

  si v <= 1:

  falso retorno

  para i en el rango de (2, int (math.sqrt (v)) + 1, 1):

  si v% i == 0:

  falso retorno

  Es cierto retorno

  # Para la prueba

  Si __name__ == "__main__":

  TIMES = 10

  g = 29 # primer

  d = 16 # dominio

  uhash = UniversalHashing (g, d)

  H = g * [0]

  for i in range (veces): # veces al azar para verificar

  x = random.randint (0, d-1)

  _, Salida = uhash.hash (x)

  H [out] + = 1

  para i en el rango de (g):

  imprimir (i, H [i])


Supongo que te gusta

Origin blog.51cto.com/14503791/2484280
Recomendado
Clasificación