Python 为什么哈希在API调用中为输入文件创建的每个新临时文件都考虑相同的值?

Python 为什么哈希在API调用中为输入文件创建的每个新临时文件都考虑相同的值?,python,flask,Python,Flask,我有一个API调用,它从表单中获取文件输入,并为创建的临时文件生成哈希键。但是,当选择不同的文件作为输入文件时,同样的散列也会生成 使用flask v.0.12和python 2.7。为什么不同文件内容的哈希键相同?hashlib.sha1()创建一个SHA-1哈希对象,您可以使用数据更新该对象,并最终获得摘要。但你没有保存那个对象。为每个块创建并丢弃一个新对象,然后创建另一个空摘要并获取其值。您总是对同一个空序列进行散列,并得到da39a3ee5e6b4b0d3255bfef95601890a

我有一个API调用,它从表单中获取文件输入,并为创建的临时文件生成哈希键。但是,当选择不同的文件作为输入文件时,同样的散列也会生成

使用flask v.0.12和python 2.7。为什么不同文件内容的哈希键相同?

hashlib.sha1()
创建一个SHA-1哈希对象,您可以使用数据更新该对象,并最终获得摘要。但你没有保存那个对象。为每个块创建并丢弃一个新对象,然后创建另一个空摘要并获取其值。您总是对同一个空序列进行散列,并得到
da39a3ee5e6b4b0d3255bfef95601890afd80709

由于在一次
读取中获取整个文档,因此将其写入临时文件并进行分块读取没有任何好处。把你抓到的数据散列出来

def gen_hash():
    for attr, document in request.files.iteritems():
        orig_filename = document.filename
        new_doc = add_doc(orig_filename, orig_filename)
        mhash1 = sha1(document.read()).hexdigest()
        print mhash1
假设
document
是一个类似文件的对象,您可以分块更新散列,避免一次读取整个文档的内存开销

def gen_hash():
    for attr, document in request.files.iteritems():
        orig_filename = document.filename
        new_doc = add_doc(orig_filename, orig_filename)
        hash = sha1()
        for chunk in iter(lambda: document.read(65536), ''):
            hash.update(chunk)
        mhash1 = hash.hexdigest()
        print mhash1

当使用两个参数调用
iter
时,第一个参数是生成数据的函数,第二个参数是迭代的结束条件。因此,
iter(lambda:document.read(65536),“”)
不断调用一个函数,从
document
读取数据,直到什么都没有了。

tmp1.flush()
tmp1.seek(0)
之前?不要删除临时文件并检查数据是否正确接收。什么是
sha1()
?可能是
sha1().update(chunk)
创建一个新的sha对象,更新它,然后丢弃它
mhash1=sha1().hexdigest()
创建一个新的空sha对象并获取其摘要。你总是在一个空的缓冲区中消化,所以它总是一样的。非常感谢,这帮了我,节省了我一天的时间!但是,该代码是否适用于非常大的文件(例如大小为几MB/GB的文件),即:mhash1=sha1(document.read()).hexdigest()?立即读取潜在的内存崩溃出现在原始代码中:
tmp1.write(document.read())
。如果
document
是一个文件对象或其他没有数据存储在内存中的对象,那么,是的,对于大数据来说是一个问题。我会更新我的答案。
def gen_hash():
    for attr, document in request.files.iteritems():
        orig_filename = document.filename
        new_doc = add_doc(orig_filename, orig_filename)
        hash = sha1()
        for chunk in iter(lambda: document.read(65536), ''):
            hash.update(chunk)
        mhash1 = hash.hexdigest()
        print mhash1