Xxhash: Combinando hashes de cadenas

Creado en 7 oct. 2017  ·  6Comentarios  ·  Fuente: Cyan4973/xxHash

Usando PowerPC de 64 bits y me gustaría un resultado hash de 32 bits sobre una secuencia de cadenas no contiguas.

¿Hay alguna pérdida en la calidad del hash si hago hash en una secuencia de cadenas no contiguas usando XXH64 y simplemente paso el resultado de cada hash como la semilla de la siguiente llamada XXH64? Además, solo tomaría los 32 bits inferiores del resultado final como mi valor hash final único de 32 bits que representa la secuencia de cadenas.

Los hash posteriores que se espera que sean iguales se realizarán con la misma secuencia exacta de cadenas. En otras palabras, no necesito que el hash final de esta secuencia "STRING1", "STRING2" sea el mismo que el hash final de "STRIN", "G1STRING2"

Mi código actual usa CRC32 y hace lo anterior (pasando el resultado intermedio a la siguiente cadena como semilla)

Gracias.

question

Comentario más útil

No importa, ahora veo que XXH64 permite un valor de inicialización de 64 bits.

Todos 6 comentarios

¿Hay alguna pérdida en la calidad del hash si hago hash en una secuencia de cadenas no contiguas usando XXH64 y simplemente paso el resultado de cada hash como la semilla de la siguiente llamada XXH64?

Hay una gran pérdida.

Por favor, eche un vistazo dentro de XXH64_state_t , XXH64_update_endian y XXH64_digest_endian .
Puede ver que XXH64 usa (escribe y lee) las variables de miembro de XXH64_state_t v1 , v2 , v3 , v4 , total_len para hacer valor hash. Y el tipo de estos valores son unsigned long long ( uint_64 , entero de 64 bits sin signo).

Podemos decir:
(1) El número total de bits de XXH64_state es mayor que 64 bits.
(2) Si una vez que el estado se minimiza (resumen) a un valor único de 64 bits, gran parte de la información desaparece.

Por lo tanto, no puede esperar su suposición. Considere utilizar funciones de transmisión .

Como sugirió @ t-mat, las funciones de transmisión fueron diseñadas exactamente para este escenario.

Supongo que le preocupa la velocidad.
No creo que se gane nada pasando el resultado de un hash al siguiente.
Mantener un contexto de transmisión tiene un costo, pero también lo tiene la finalización de un hash. Espero que finalizar el hash después de cada pocos bytes en realidad cueste más que mantener un contexto de transmisión, donde la finalización solo se realiza una vez, cuando se invoca XXH_digest() .

Mi objetivo es proporcionar un reemplazo 'directo' para el uso de CRC32 para mejorar la velocidad, con un cambio mínimo de código en los muchos sitios de llamadas. El enfoque de transmisión no es técnicamente aplicable, porque el hash de una secuencia dividida en fragmentos de 10 bytes será el mismo que el hash de la misma secuencia exacta dividida en partes de 100 bytes. La 'estructura' de las cadenas no contiguas es relevante y debería contribuir al resultado hash.

Esta es una cadena que tiene referencias 'indirectas' a otras cadenas incrustadas en ella en ubicaciones arbitrarias (solo un nivel de profundidad). Necesito hash las cadenas indirectas y los subconjuntos de la cadena base (sin incluir los punteros a las cadenas indirectas)

Vi que usar XXH64 es más rápido en hardware de 64 bits y funcionará mejor que XXH32, tomando 32 bocados del resultado como hash.

Estoy contento con un nivel de 32 bits de calidad de hash, por lo que parecía razonable poner el hash de 32 bits de las distintas cadenas como semilla para incorporar la siguiente cadena.

Si la estructura de su programa existente lo permite, prefiera pasar 64 bits entre 2 hashes consecutivos. Realice la extracción de 32 bits solo al final. Maximizará la calidad del hash.

¿Está sugiriendo modificar el código para permitir una semilla de 64 bits? Actualmente, en lugar de simplemente extraer los 32 bits bajos para sembrar el siguiente paso, estoy combinando el 32 alto y el 32 bajo juntos para que todos los 64 bits 'contribuyan' al arrastre de 32 bits. Desafortunadamente, no es factible (sin copiar datos) agregar o anteponer el valor intermedio de 64 bits a la siguiente cadena, ya que no tengo control sobre ese almacenamiento, me lo entregan.

No importa, ahora veo que XXH64 permite un valor de inicialización de 64 bits.

¿Fue útil esta página
0 / 5 - 0 calificaciones