2010-11-17 135 views
0

我使用python与sqlite。我正在实施POP3协议。我有一个表比较sql值

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

现在我需要通过检查对现有MSG_ID的表中检索到的消息的消息ID是否有重复的邮件。我使用md5加密了msg_id并将其放入hashkey列中。每当我检索邮件时,我都会对邮件ID进行哈希处理,并使用表值对其进行检查。继承人我做了什么。

 

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 

它只是拒绝正常工作。我尝试打印行值,它显示在unicode中,这是问题所在,因为它无法正确比较。

有没有更好的方法来做到这一点,或改善我的方法?

+0

只是好奇 - 为什么你在做比较之前散列msg_id字段?有没有理由不能比较msg_id的? – 2010-11-17 19:25:39

+0

@Bob:O(1)与表中现有的字符串进行比较。 (而不是O(n))。这被称为实习字符串,参见:http://en.wikipedia.org/wiki/String_interning。 – 2010-11-17 19:29:08

+0

另外:MD5是散列算法,不是“加密”。你正在对'msg_id'进行哈希处理,而不是对它进行加密。 – 2010-11-17 19:30:39

回答

3

好吧,如果你唯一的问题是与比较,那么你可以尝试:

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

因为row是一个元组而不是一个字符串,但是你的基本策略对我来说似乎是错误的。您正在为数据库中的每一行检索hashkey,然后自行搜索正确的一行。更好地让数据库为你做搜索。数据库可能会更好地搜索(因为它可能在hashkey字段中有一个索引 - 您确实为该字段创建了一个索引,是吗?),并且它只需要向您发送一个结果,从而节省时间。所以,你可以发出这样的查询,以确定是否存在消息:

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

的风格的最后一点:Python有TrueFalse,所以没有必要使用布尔10

+0

虽然好奇,它并不总是有真和假。所以你可以做一些有趣的事情,比如'(False + 1)== 1',这是真的。 =) – 2010-11-17 19:35:58

0

可能是一个主意,要求MySQL来搜索哈希键:

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

主要问题是您正在尝试将一个Python字符串(m.hexdigest())与一个元组进行比较。

此外,另一个海报的建议,您使用SQL进行比较可能是很好的建议。另一个SQL建议是修复你的列 - TEXT的一切可能不是你想要的;您的hashkey列中的索引很可能是一件好事。