Para poder detectar RT de un tweet en particular, planeo almacenar hashes de cada tweet formateado en la base de datos.

¿Qué algoritmo hash debo usar? Críptico, por supuesto, no es esencial. Solo una forma mínima de almacenar datos como algo que luego se puede comparar si es lo mismo, de manera eficiente.

Mi primer intento fue usando hash md5. Pero pensé que puede haber algoritmos de hash que sean mucho más eficientes, ya que no se requiere seguridad.

2
Lakshman Prasad 2 may. 2009 a las 22:17

6 respuestas

La mejor respuesta

Estás tratando de cortar una cadena, ¿verdad? Los tipos incorporados se pueden codificar de inmediato, solo haga hash("some string") y obtendrá algo de int. Es la misma función que usa Python para dictonarys, por lo que es probablemente la mejor opción.

0
Jochen Ritzel 3 may. 2009 a las 18:59

¿Realmente necesitas hacer picadillo? Los mensajes de Twitter son lo suficientemente cortos (y el espacio en disco lo suficientemente barato) como para que sea mejor almacenar todo el mensaje, en lugar de consumir ciclos de reloj para hacer hash.

6
Chris Upchurch 2 may. 2009 a las 18:21

Módulo de estantería de Python? http://docs.python.org/library/shelve.html

0
Dave 2 may. 2009 a las 18:20

Bueno, los tweets tienen solo 140 caracteres de longitud, por lo que incluso podría almacenar todo el tweet en la base de datos ...

Pero si realmente quieres "hash" de alguna manera, una forma simple sería tomar la suma de los valores ASCII de todos los caracteres en el tweet:

sum(ord(c) for c in tweet)

Por supuesto, siempre que tenga una coincidencia de hashes, debe verificar si los tweets son iguales, ya que la probabilidad de encontrar dos tweets que den el mismo "resumen de suma" probablemente no sea insignificante.

1
David Z 2 may. 2009 a las 18:22

Hay algunos problemas aquí. Primero, los RT no siempre son idénticos. Algunas personas agregan un comentario. Otros cambian la URL para el seguimiento. Otros agregan a la persona que están RT'ing (que puede o no ser el creador).

Entonces, si vas a hacer hash el tweet, debes reducirlo a la carne del tweet, y solo hash eso. Buena suerte.

Arriba, alguien mencionó que con 32 bits, comenzará a tener colisiones a unos 65.000 tweets. Por supuesto, podrías tener colisiones en el tuit # 2. Pero creo que el autor de ese comentario estaba confundido, ya que 2 ^ 16 = ~ 65K, pero 2 ^ 32 = ~ 4 billones. Entonces tienes un poco más de espacio allí.

Un mejor algoritmo podría ser tratar de derivar las partes "únicas" del tweet y tomar una huella digital. No es un hash, es una huella digital de algunas palabras clave que definen la unicidad.

2
BobBob 16 jul. 2009 a las 19:07

Me hago eco del comentario de Chris sobre no usar un hash (su motor de base de datos puede indexar campos de 140 caracteres de manera eficiente).

Si quisiera usar un hash, MD5 también sería mi primera opción (16 bytes), seguido de SHA-1 (20 bytes).

Hagas lo que hagas, no uses la suma de caracteres. No puedo encontrar una función que tenga más colisiones (todos los anagramas son iguales), ¡además es más lenta!

$ python -m timeit -s 'from hashlib import md5' 'd=md5("There once was a man named Michael Finnegan.").digest()'
100000 loops, best of 3: 2.47 usec per loop
$ python -m timeit 'd=sum(ord(c) for c in "There once was a man named Michael Finnegan.")'
100000 loops, best of 3: 13.9 usec per loop
2
Tim Hatch 3 may. 2009 a las 18:43