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])