es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Codificar y decodificar hashes para utilizar como GUID en bases de datos utilizando Python.

Estoy seguro de que este caso de uso es lo suficientemente común, pero debo tener los términos de búsqueda incorrectos.

Caso de uso:

  • Los datos se recolectan de diversas fuentes y no tienen una identificación única (GUID).
  • Para generar una, quiero codificar algunas columnas de texto como parte del preprocesamiento de Python.
    • Idealmente, los valores codificados serán hexadecimales de aproximadamente 20-30 caracteres (GUID).
  • Los valores codificados deben poder descodificarse fácilmente según sea necesario.

Entrada:

  • Objeto .json:
{
  "guid": "",
  "source": "nytimes",
  "pubDate": "Wed, 15 Dec 2021 20:00:47 +0000",
  "headline": "Fed Expected to Cut Economic Support Faster as Inflation Fears Grow",
  "link": "https://www.nytimes.com/live/2021/12/15/business/inflation-retail-sales-stocks"
}

Intentado:

  • Utilizando el método integrado hash() de Python.
def create_hash(obj):
  for o in obj:
    hash_object = hash(o['link']) + hash(o['pubDate'])
    o['guid'] = str(hash_object)
  return headline

Salida:

{
  "guid": "-828245169239551952",
  "source": "nytimes",
  "pubDate": "Wed, 15 Dec 2021 20:44:39 +0000",
  "headline": "Fed Expected to Cut Economic Support Faster as Inflation Fears Grow",
  "link": "https://www.nytimes.com/live/2021/12/15/business/inflation-retail-sales-stocks"
}

Problemas:

  1. ¿Es la función hash() una forma segura de evitar colisiones en la base de datos?
    • Si es así, ¿cómo se descodifica la función hash()?
  2. ¿Existe una mejor manera de hacer esto?
Tags:  , ,

Answer

  1. Avatar for davy.ai
    1. Utilizar la función hash() para generar un GUID no es una forma segura de evitar colisiones en la base de datos. Las funciones de hash como hash() no están diseñadas para generar ID únicos y pueden producir el mismo valor de hash para diferentes valores de entrada, lo que resulta en colisiones. Además, la función hash() en Python no garantiza producir el mismo valor de hash en diferentes implementaciones o ejecuciones de Python.

      Si necesitas un identificador único, sería mejor utilizar una biblioteca como uuid para generar un identificador universalmente único (UUID). Los UUID están diseñados específicamente para generar identificadores únicos y tienen una probabilidad más baja de colisiones.

      Para generar un UUID para el objeto JSON, podrías modificar el código de la siguiente manera:

      import uuid
      
      def create_guid(obj):
         for o in obj:
             o['guid'] = str(uuid.uuid4())
         return obj
      

      Esto agregará un nuevo campo GUID al objeto JSON con un valor UUID.

    2. Si necesitas que el GUID se derive de los datos de entrada y no requieres que sea universalmente único, podrías considerar una función de hash diseñada para la generación de ID únicos como SHA-256. Sin embargo, es importante tener en cuenta que incluso con funciones de hash más fuertes como SHA-256, aún pueden ocurrir colisiones si los datos de entrada son lo suficientemente grandes.

      Para generar un GUID usando SHA-256, podrías modificar el código de la siguiente manera:

      import hashlib
      
      def create_guid(obj):
         for o in obj:
             input_str = o['link'] + o['pubDate']
             hash_object = hashlib.sha256(input_str.encode())
             o['guid'] = hash_object.hexdigest()
         return obj
      

      Esto generará un GUID utilizando la función de hash SHA-256 que toma como entrada los valores concatenados de ‘link’ y ‘pubDate’. El hash resultante se convierte en una cadena hexadecimal, que se asigna al campo GUID. Esta implementación no garantiza ser libre de colisiones, pero la probabilidad de colisiones se puede reducir eligiendo una función de hash más fuerte como SHA-256.

Comments are closed.