Por lo tanto, lo divertido de los filtros bloom es que para que funcionen de manera efectiva necesitan múltiples funciones hash.
Java Strings ya tiene una función de hash incorporada que puede usar - String.hashCode() con un hash entero de 32 bits. Es un código hash OK para la mayoría de los propósitos, y es posible que esto sea suficiente: si divide esto en 2 códigos hash de 16 bits por separado, entonces esto podría ser suficiente para que su filtro bloom funcione. Probablemente tengas algunas colisiones pero está bien, se espera que los filtros de floración tengan algunas colisiones.
Si no es así, probablemente querrás rodar el tuyo propio, en cuyo caso recomendaría usar String.getChars() para acceder a los datos sin procesar, luego utilizar esto para calcular varios hashcodes.
Clojure código para que pueda empezar (simplemente sumando los valores de caracteres):
(let [s "Hello"
n (count s)
cs (char-array n)]
(.getChars s 0 n cs 0)
(areduce cs i v 0 (+ v (int (aget cs i)))))
=> 500
Nota el uso de Java de Clojure interoperabilidad llamar getChars, y el uso de areduce para darle una iteración muy rápido durante la matriz de caracteres.
Puede que también le interese esta implementación de filtro de floración de Java que encontré en Github: https://github.com/MagnusS/Java-BloomFilter. La implementación de código hash se ve bien a primera vista, pero utiliza una matriz de bytes que creo que es un poco menos eficiente que el uso de caracteres debido a la necesidad de ocuparse de la sobrecarga de codificación de caracteres.
¿Qué tipo de datos son las llaves? ¿Instrumentos de cuerda? Arrays de bytes? Enteros? UUIDs? – pmdj
Estoy probando la pertenencia a un conjunto de cadenas – jdoig
Puede intentar aplicando repetidamente una función hash de mezcla al valor hash incorporado reportado por el método 'hash()' en la cadena, p. Ej. http://www.cris.com/~Ttwang/tech/inthash.htm Los valores generados pueden correlacionarse demasiado, lo que podría hacer que el filtro de floración sea ineficaz. Un enfoque que he usado en el pasado es usar una función hash con un resultado muy largo, como SHA-256, y dividir el resultado en fragmentos. Esto puede ser demasiado lento para sus propósitos. Lo más simple podría ser hacer una búsqueda en google de 'función de hash de cadena' e implementar algunos de los resultados que proporciona. – pmdj