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:
- ¿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()
?
- Si es así, ¿cómo se descodifica la función
- ¿Existe una mejor manera de hacer esto?
davy.ai
hash()
para generar un GUID no es una forma segura de evitar colisiones en la base de datos. Las funciones de hash comohash()
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ónhash()
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:
Esto agregará un nuevo campo GUID al objeto JSON con un valor UUID.
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:
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.