Filtro Bloom, una implementación en PHP

Filtro Bloom, una implementación en PHP

En esta ocasión voy a presentar una implementación simple de un filtro de Bloom implementado en PHP. Puedes ver la implementación en mi github: https://github.com/oscarpascualbakker/bloomfilter.

Un filtro Bloom es una estructura de datos probabilísticos que se utiliza para comprobar si un elemento es miembro de un conjunto. En esta estructura, los elementos se pueden agregar al conjunto, pero no eliminar.

Una consulta a un filtro Bloom devuelve «posiblemente en el conjunto» o «definitivamente no en el conjunto».

Un filtro Bloom es una matriz de m bits (bitarray), inicialmente todos establecidos en 0. También debe haber k funciones de hash diferentes definidas, cada una de las cuales mapea o aplica un hash a algún elemento establecido en una de las m posiciones de la matriz, generando una distribución aleatoria uniforme. Normalmente, k es una constante pequeña que depende de la probabilidad de falsos errores que vamos a permitir.

Para agregar un elemento al conjunto, es necesario realizar k funciones de hash sobre el elemento, obtener las k posiciones correspondientes en el filtro y establecer estos bits en 1.

Para verificar si un elemento está en el conjunto es necesario realizar de nuevo las k funciones de hash sobre ese elemento para obtener las posiciones en el filtro. Si alguno de los bits en estas posiciones es 0, el elemento definitivamente no está en el conjunto.

Si todas las posiciones se establecen en 1, entonces el elemento está en el conjunto o los bits se han establecido en 1 durante la inserción de otros elementos, lo que da como resultado un falso positivo.

No es posible eliminar elementos en un filtro Bloom simple, y no hay forma de distinguir entre un positivo legítimo y un falso positivo. Técnicas más avanzadas pueden resolver este problema.

Filtro Bloom
Fuente: Wikipedia

Utilidades de un filtro Bloom

Los filtros Bloom son útiles en los casos en que:

  • los datos a buscar son grandes
  • la memoria disponible en el sistema es limitada/baja

Por este motivo el algoritmo tiene muchos usos. Dado que es un sistema que responde de forma muy rápida si un elemento está (¡probablemente!) en un conjunto o no, se usa para ahorrar tiempo y espacio.

  • Sistemas de almacenamiento en caché
  • Detección de contraseña débil
  • Protocolo de caché de Internet
  • Navegación segura en Google Chrome
  • Sincronización de billetera en Bitcoin (esto fue deprecado de Bitcoin, pero formó parte de las primeras versiones)
  • Rastreo de IP basado en hash
  • Seguridad cibernética como análisis de virus

Espero que te haya gustado este algoritmo (entiendo que sí, si has leído hasta aquí).

¡Hasta la próxima!

Cola de prioridad en PHP 7.4

Hace unos días implementé una cola de prioridad en PHP 7.4 basándome en el concepto de ‘Heap‘. Un heap es un montón, una pila que parece desordenada, pero cuyo contenido sigue una lógica ordenada. De hecho, a partir de este concepto nace la técnica de ordenación del mismo nombre ‘Heap sort‘.

Antes de comentar la implementación de la cola, explicaré brevemente qué ventajas obtenemos al hacer así las cosas.

Ventajas de un heap para organizar una cola de prioridad

Al crear un sistema de prioridad como este buscamos obtener un medio ágil y rápido tanto de inserción como de extracción. En el caso del heap usamos un árbol binario, dado que con esta estructura podemos conseguir implementar la cola en un árbol (un array) homogéneo y completo. Este es el aspecto de un heap construido mediante un árbol binario:

Arbol binario que representa la cola de prioridad

Keep reading →

8 cosas que he aprendido sobre los equipos de desarrollo

Read this article in english

Llevo muchos años programando en equipo y, a veces, liderándolos. Hay muchísimas cosas que aún aprenderé en el futuro, pero … mi años no han pasado en vano. 😉

1. La calidad es importante

Sí, la calidad del código es importante, tanto en cómo lo escribes y en cómo lo mantienes. No eres un buen programador hasta que no seas capaz de garantizar que tu código es bueno, y eso significa sin bugs, testeable y limpio (volveré sobre esto más tarde). Y cuando hablamos de calidad hay dos puntualizaciones a hacer: 1) el uso de patrones de diseño es prácticamente obligatorio, y 2) el código debe ser SOLID. No voy a profundizar en estos dos puntos en este artículo, pero lo haré en el futuro.

Consejo: si eres programador y no sabes qué es esto de patrones y SOLID… empieza hoy. Créeme.

Keep reading →