Hashlib在使用多处理时返回重复哈希

时间:2015-06-25 11:05:15

标签: python multiprocessing hashlib

我正在使用hashlib创建文件的sha256哈希值,然后将其与存储在数据库中的文件的先前哈希值进行比较。

def create_hash(file, id, hex=True, hash_type=hashlib.sha256):
    con = db.connect(db_host, db_user, db_pass, db_db)
    cur = con.cursor()
    hashinst = hash_type()
    with open(file, 'rb') as f:
            for chunk in iter(lambda: f.read(hashinst.block_size * 128), b''):
                hashinst.update(chunk)
            hash = hashinst.hexdigest() if hex else hashinst.digest()
    print hash
    cur.execute("SELECT * FROM Previews WHERE S_Id=%s", (id))
    row = cur.fetchone()
    count = row[2] + 1
    cur_hash = row[1]
    if hash == cur_hash:
        count = row[2] + 1
        cur.execute("UPDATE Previews SET Count = %s WHERE S_Id = %s", (count, id))
        con.commit()
    elif hash != cur_hash:
        cur.execute("UPDATE Previews SET Count = 0 WHERE S_Id = %s", (id))
        con.commit()
        cur.execute("UPDATE Previews SET Hash = %s WHERE S_Id = %s", (hash, id))    
        con.commit()

速度是必须的,所以我也在使用多处理模块。

  pool = multiprocessing.Pool(processes= pCount)
    pool.map(create_preview, rows)

这会调用一个函数create_preview来创建图像并调用上面的函数。问题是所有哈希都是一样的。如果我在for循环中执行此操作而不是使用多处理池我没有问题,并且所有散列都不同。

有没有人知道使用hashlib模块和多处理或者我可以用来比较文件的替代方法可能遇到的任何问题?

1 个答案:

答案 0 :(得分:0)

因此,您应该使用map(lambda row: create_preview(row[0]), rows)代替map(create_preview, rows)