2010-11-17 7 views
0

J'utilise sqlite avec python. J'implémente le protocole POP3. J'ai une tableComparaison des valeurs SQL

 
msg_id text 
date text 
from_sender text 
subject text 
body text 
hashkey text 

Maintenant je dois vérifier les messages en double en vérifiant l'identifiant de message du message récupéré contre les années MSG_ID existantes dans le tableau. J'ai crypté le msg_id en utilisant md5 et l'ai mis dans la colonne hashkey. Chaque fois que je récupère du courrier, je hache l'ID du message et le vérifie avec les valeurs de la table. Heres ce que je fais.

 

def check_duplicate(new): 
    conn = sql.connect("mail") 
    c = conn.cursor() 
    m = hashlib.md5() 
    m.update(new) 
    c.execute("select hashkey from mail") 
    for row in c: 
     if m.hexdigest() == row: 
      return 0 
     else: 
      continue 

    return 1 

Il refuse simplement de fonctionner correctement. J'ai essayé d'imprimer la valeur de rangée, elle le montre en unicode, c'est où le problème réside car il ne peut pas comparer correctement.

Existe-t-il une meilleure façon de faire ou d'améliorer ma méthode?

+0

Juste curieux - pourquoi vous hashing le champ msg_id avant de faire la comparaison? Y at-il une raison pour laquelle vous ne pouvez pas comparer les msg_id? –

+0

@Bob: O (1) pour chaque comparaison avec les chaînes existantes de la table. (Au lieu de O (n).) Ceci est connu comme des chaînes d'internement, voir: http://en.wikipedia.org/wiki/String_interning. –

+0

Aussi: MD5 est un algorithme de hachage, pas de "cryptage". Vous êtes hashing the 'msg_id', ne pas le chiffrer. –

Répondre

3

Eh bien, si votre problème est seulement avec la comparaison, alors vous pouvez essayer:

if m.hexdigest() == row[0]: 

depuis row est un tuple et non une chaîne, mais votre stratégie de base me semble erronée. Vous récupérez le hashkey pour chaque ligne de la base de données, puis vous effectuez votre propre recherche. Il vaut mieux que la base de données fasse la recherche pour vous. La base de données est susceptible d'être meilleure à chercher (puisqu'elle a probablement un index sur le champ hashkey - vous avez créé un index pour ce champ, n'est-ce pas?) Et il vous suffit d'envoyer un résultat pour gagner du temps. Ainsi, vous pouvez émettre une requête comme celui-ci pour déterminer si le message existe:

m.execute('select exists(select * from mail where hashkey=?)', m.hexdigest()) 

Un point final de style: Python a True et False, donc il n'y a pas besoin d'utiliser 1 et 0 pour booléens.

+0

Bien que, curieusement, il n'a pas toujours eu Vrai et Faux. Donc, vous pouvez faire des choses amusantes comme '(False + 1) == 1', ce qui est vrai. =) –

0

peut-être une idée de demander MySQL pour rechercher la clé de hachage:

select count(*) from mail where hashkey = 'TheHashKey' 
0

Le problème principal est que vous essayez de comparer une chaîne Python (m.hexdigest()) avec un tuple.

En outre, la suggestion d'un autre poster que vous utilisez SQL pour la comparaison est probablement un bon conseil. Une autre suggestion SQL serait de fixer vos colonnes - TEXT pour tout n'est probablement pas ce que vous voulez; un index sur votre colonne hashkey est très probablement une bonne chose.