在对数据库进行一些审计时,我发现一些附件内容与文档的_attachments
贴图中给出的散列不匹配。
我通过下载文件并计算它的散列来testing这个。 与couchdb相比,显示他们不匹配。 然后我注意到,不匹配的附件是couchdb被configuration为压缩的附件。 看来,我的沙发IDconfiguration使用snappy压缩:
foobox# grep -E 'file_compression|compressible_types' /etc/couchdb/{default,local}.ini /etc/couchdb/default.ini:file_compression = snappy /etc/couchdb/default.ini:compressible_types = text/*, application/javascript, application/json, application/xml
但是,当我尝试使用snappy压缩附件内容,并计算压缩数据的散列值时,它仍然与couchdb散列不匹配。 在我下面的例子中, document-25977
是未压缩的(type application / pdf),而未压缩的hash匹配由couchdb提供的。 第二, document-78608
,是一个可压缩types(text / plain),并且哈希不匹配:
foobox$ python hashcompare.py document-25977 couch len: 142918 couch hash: 028540dd92e1982bcb65c29d32e9617e (md5) local uncompressed len: 142918 local uncompressed hash: 028540dd92e1982bcb65c29d32e9617e local compressed len: 132333 local compressed hash: 3157583223dc1a53e1a3386d6abc312d document-78608 couch len: 2180 couch hash: e613ab6d7f884b835142979489170499 (md5) local uncompressed len: 2180 local uncompressed hash: 0ab2516c820f5d7afb208e3be7b924dd local compressed len: 1382 local compressed hash: d9e79232662f57e6af262fc9f867eaf2
这是我用来比较的脚本:
import couchdb import snappy import md5 import base64 server = couchdb.Server('http://localhost:9999') db = server['program1'] for doc_id in ['document-25977', 'document-78608']: print doc_id doc = db[doc_id] att_stub = doc['_attachments'][doc_id] hash_type, tmpdigest = att_stub['digest'].split('-', 1) att = db.get_attachment(doc, doc_id) data = att.read() # CouchDB is using snappy compression compressed_data = snappy.compress(data) print 'couch len: ', att_stub['length'] print 'couch hash: ', base64.b64decode(tmpdigest).encode('hex'), '(%s)' % hash_type print 'local uncompressed len: ', len(data) print 'local uncompressed hash: ', md5.md5(data).digest().encode('hex') print 'local compressed len: ', len(compressed_data) print 'local compressed hash: ', md5.md5(compressed_data).digest().encode('hex') print
我已经validation过,这些文件在取得时是无损的。 那么我错过了什么? 我不太熟悉Erlang读取couchdb源文件并找出正在发生的事情。 为什么文件的摘要与其内容压缩或其他方式不符?
不知道如果你把这个整理出来,但我开始沿着同样的道路走下去。 在查看一下源代码后,看起来摘要计算是在压缩之前进行的,所以我不相信压缩会影响摘要值。
我能够在节点中使用以下内容重现由CouchDB生成的附件的md5摘要:
var crypto = require('crypto'); var attachmentData = "base64-encoded-data" var buf = new Buffer(attachmentData, 'base64') , md5 = crypto.createHash('md5').update(buf).digest('base64');
希望能帮助你或者将来有人在寻找细节。
CouchDB确实会在压缩可压缩文件之后计算哈希值。
但附件使用zlib压缩,我一直无法匹配他们所做的,所以唯一的解决scheme似乎上传后将其摘要,并将其存储在某处。