2010-11-17 5 views
0

Я использую sqlite с python. Я реализую протокол POP3. У меня есть таблицаСравнение значений sql

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

Теперь мне нужно, чтобы проверить наличие дубликатов сообщений, проверяя идентификатор сообщения сообщения извлеченного против существующих MSG_ID лет в таблице. Я зашифровал msg_id с помощью md5 и поместил его в столбец hashkey. Всякий раз, когда я получаю почту, я использую идентификатор сообщения и проверяю его со значениями таблицы. Вот что я делаю.

 

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? –

+0

@Bob: O (1) для каждого сравнения с существующими строками в таблице. (Вместо O (n).) Это известно как интернирование строк, см. Http://en.wikipedia.org/wiki/String_interning. –

+0

Также: MD5 - это алгоритм хеширования, а не «шифрование». Вы хешируете 'msg_id', а не шифруете его. –

ответ

3

Ну, если только проблема с сравнения, то вы можете попробовать:

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

после row это кортеж, а не строка, но ваша основная стратегия кажется мне неправильной. Вы извлекаете hashkey для каждой строки из базы данных, а затем выполняете собственный поиск нужного. Намного лучше сделать базу данных для вас. База данных, вероятно, будет лучше искать (поскольку она, вероятно, имеет индекс в поле hashkey - вы создали индекс для этого поля, не так ли?), И он должен только отправить один результат вам, экономя время. Таким образом, вы могли бы выдать запрос, как это определить, существует ли сообщение:

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

конечной точке стиля: Python имеет True и False, поэтому нет необходимости использовать 1 и 0 для Booleans.

+0

Хотя, как ни странно, у него не всегда были Истина и Ложь. Таким образом, вы можете делать такие забавные вещи, как '(False + 1) == 1', что верно. знак равно –

0

Может быть идея попросить MySQL искать хэш-ключа:

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

Основная проблема заключается в том, что вы пытаетесь сравнить строку Python (m.hexdigest()) с кортежем.

Кроме того, предложение другого плаката о том, что вы используете SQL для сравнения, вероятно, является хорошим советом. Еще одно предложение SQL - это исправить ваши столбцы - ТЕКСТ для всего, вероятно, не того, что вы хотите; индекс на вашем столбце hashkey, скорее всего, хорош.

Смежные вопросы