2010-11-17 212 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列中的索引很可能是一件好事。