Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

308
Vistas
Restricción única con diferencia de Hamming en postgres

La última columna image_hash contiene hash de imagen de archivos de imagen ( varchar ).

Mi objetivo es crear una restricción única en esta columna, pero debe seguir una condición específica.

Por ejemplo, si image_hash 1 e image_hash 2 son iguales, entonces la similitud es 1

Si son completamente diferentes - similitud →0

Por similitud, supongo que la diferencia de Hamming debería encajar bien.

La condición es:

Si la diferencia de similitud entre image_hash 1 y image hash 2 es menor que X (por ejemplo, 0.1), entonces los hash se consideran iguales y esto sería una violación de unicidad.

Si la similitud es mayor que X, entonces no se viola la restricción única.

Yo he tratado :

 SELECT image_hash, similarity(image_hash, '00041dffff101800') AS sml FROM archives_imagemodel WHERE id=431

Pero es demasiado sensible y todavía no sé cómo convertirlo en una restricción única.

Soy malo en Postgres, así que lo siento si la pregunta es tonta o está fuera de la realidad.

¿Algunas ideas?

Gracias

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Eso es posible en principio, pero requeriría escribir una extensión en C que proporcione:

  • Un operador de similitud que implementa la distancia de Hamming. TRUE si de manera similar excede el umbral.

  • Una clase de operador GiST para text que admite el operador.

Luego puede crear una restricción de exclusión utilizando ese operador, que haría exactamente lo que desea. Pero ten en cuenta que tendrías que sumergirte en las entrañas de PostgreSQL para eso (pero no tendrías que modificar el servidor).

Un enfoque más mundano sería usar un disparador, pero sin un índice GiST como se describe anteriormente, eso significaría un escaneo secuencial para cada modificación de datos, lo que mataría el rendimiento. Además, a menos que utilice el nivel de aislamiento SERIALIZABLE , dichos disparadores están sujetos a condiciones de carrera .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda