Función que extiende la entrada


14

Me gustaría saber si hay una función de números de n bits a números de n bits que tenga las siguientes características:f

  • f debe ser biyectivo
  • Tanto como deben calcularse bastante rápidof - 1ff1
  • f debería devolver un número que no tenga una correlación significativa con su entrada.

La razón es esta:

Quiero escribir un programa que funcione con datos. Parte de la información de los datos se almacena en un árbol de búsqueda binario donde la clave de búsqueda es un símbolo de un alfabeto. Con el tiempo, agrego más símbolos al alfabeto. Los nuevos símbolos simplemente obtienen el siguiente número gratuito disponible. Por lo tanto, el árbol siempre tendrá un pequeño sesgo en las teclas más pequeñas, lo que provoca un reequilibrio mayor de lo que creo que debería ser necesario.

Mi idea es manglear los números de los símbolos con manera que se extiendan ampliamente en todo el rango de . Dado que los números de los símbolos solo importan durante la entrada y la salida, lo que ocurre solo una vez, la aplicación de dicha función no debería ser demasiado costosa.[ 0 , 2 64 - 1 ]f[0,2641]

Pensé en una iteración del generador de números aleatorios Xorshift, pero realmente no sé cómo deshacerlo, aunque en teoría debería ser posible.

¿Alguien sabe tal función?
¿Es esta una buena idea?


1
No soy un experto, pero tal vez puedas usar una permutación pseudoaleatoria (ver, por ejemplo, el cifrado Feistel )
Vor

Si esencialmente está calculando una función hash, ¿por qué no usar hash?
vonbrand

@vonbrand Hashing no es reversible. Ver requisito número 2.
FUZxxl

¿ Por qué tiene que ser reversible? ¿Qué hay de malo en hacerlo reversible por búsqueda?
vonbrand

1
Puede almacenar (f (x), x) como claves.
adrianN

Respuestas:


6

Puede usar el hash de Fibonacci , a saber

.hF(k)=k512k512

Para obtienes n números separados por pares (aproximadamente) distribuidos uniformemente en [ 0 , 1 ] . Al escalar a [ 1 .. M ] y redondear (hacia abajo), obtienes números distribuidos uniformemente en ese intervalo.k=1,,nn[0,1][1..M]

Por ejemplo, estos son escalados a [ 0..10000 ] (secuencia original izquierda, ordenada a la derecha):hF(1),,hF(200)[0..10000]

ingrese la descripción de la imagen aquí

Esta es una instancia de lo que Knuth llama hashing multiplicativo . Para el tamaño de palabra de la computadora, A algún número entero relativamente primo para w y M el número de direcciones necesarias, utilizamoswAwM

h(k)=M((kAw)mod1)

como función hash. Lo anterior sigue con (asegúrese de poder calcularlo con suficiente precisión). Si bien esto también funciona con cualquier otro número irracional además deϕ-1, es uno de los dos únicos números que conducen a los números "más uniformemente distribuidos".A/w=ϕ1=512ϕ1

Encuentre más en El arte de la programación de computadoras , Volumen 3 de Donald Knuth (capítulo 6.4 de la página 513 en la segunda edición). En particular, encontrará por qué los números resultantes son distintos por pares (al menos si ) y cómo calcular la función inversa si usa A y w naturales en lugar de ϕ - 1 .nMAwϕ1


1
¿Cómo calcular eficiente? f1
frafl

1
@frafl Espero que mi edición aborde un poco su preocupación. Sin embargo, está claro que estas técnicas de hash no están especialmente diseñadas para ser eficientemente invertibles.
Raphael

Sí, lo votaré, sin embargo, no lo recomendaría como la respuesta aceptada.
frafl

1

Para entradas de bits, esta función funciona:k

hash(n)=(nmod2k2)2k2+ndiv2k2

Esto es reversible, ya que , y tiene pares no secuenciales { n , m } , n < m , donde h a s h ( m ) < h a s h ( n ) . Tenga en cuenta que la salida y la entrada pueden correlacionarse, especialmente si su entrada está en { 1 , ... , 2 khash(hash(n))=n{n,m},n<mhash(m)<hash(n).{1,,2k21}

Ref: función hash reversible


Esto se ve simple y agradable. Voy a probar eso.
FUZxxl

1
1ρ

está bastante claro! para 64 bits (0x00000000FFFFFFFF) y debe cambiar (<<) 32 bits. Esta función es simple, práctica y suficientemente rápida en la práctica.
Reza

1
x{1,,2321}232x
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.