def add_image(self, img_file, uuid, image_type): import os self.size = self.size + os.path.getsize(img_file) length = get_file_fingerprints(img_file) length_list = [] length_list.append(str(image_type)) count = len(length) point = 0 if count > 4: count1 = count / 4 for i in range(count): point += length[i][1] if i % count1 == 0: length_list.append(i2b(point)) point = 0 continue if i == (count - 1): length_list.append(i2b(point)) else: for i in range(count): point += length[i][1] length_list.append(i2b(point)) img_block_gen = io.read_chunks_from_file(img_file, length) img_data = ChunksImage.new(uuid) #img_data.fingerprints.append('|'.join(length_list)) img_data.fingerprints.append(length_list) img_data.fingerprints.append( self.add_chunks(img_block_gen)) #这个迭代器用的好像有问题 self.store_image(img_data) return img_data
TARGET = 'test.bin' filesizeM = 10 Mb = 1024 * 1024 os.system("dd if=/dev/urandom of=%s bs=%d count=%d" % (TARGET, Mb, filesizeM)) random.seed(open(TARGET, 'rb').read(1024)) set_min_block_size(1024) set_max_block_size(2048) set_average_block_size(1024) r = Rabin() before = get_file_fingerprints(TARGET) f = open(TARGET, 'rb+') data = f.read(int(filesizeM / 2 * Mb)) r.update(data) r.update(b'x') data = f.read() r.update(data) after = r.fingerprints() assert len(before) <= len(after) diffcount = 0 for i in range(len(before)): try: bs, bl, bp = before[i] As, al, ap = after[i]
# print('(%s, %s, %s)' % (start, length, fingerprint)) reached.append((start, length, fingerprint)) r = Rabin() r.register(block_reached) with open(TARGET, 'rb') as f: while True: size = random.randint(1,os.path.getsize(TARGET)) data = f.read(size) if len(data) == 0: break r.update(data) partial = r.fingerprints() gold = get_file_fingerprints(TARGET) assert len(gold) == len(partial) == len(reached) for i in range(len(gold)): try: gs,gl,gp = gold[i] ps,pl,pp = partial[i] rs,rl,rp = reached[i] assert gs == ps == rs assert gl == pl == rl assert gp == pp == rp except: print('gold ', gold[i]) print('partial', partial[i]) print('reached', reached[i])
TARGET = 'test.bin' filesizeM = 10 Mb = 1024*1024 os.system("dd if=/dev/urandom of=%s bs=%d count=%d" % ( TARGET, Mb, filesizeM)) random.seed(open(TARGET, 'r').read(1024)) set_min_block_size(1024) set_max_block_size(2048) set_average_block_size(1024) r = Rabin() before = get_file_fingerprints(TARGET) f = open(TARGET, 'r+') data = f.read(filesizeM/2 * Mb) r.update(data) r.update('x') data = f.read() r.update(data) after = r.fingerprints() assert len(before) <= len(after) diffcount = 0 for i in range(len(before)): try: bs,bl,bp = before[i] As,al,ap = after[i]
reached.append((start, length, fingerprint)) r = Rabin() r.register(block_reached) with open(TARGET, 'rb') as f: while True: size = random.randint(1, os.path.getsize(TARGET)) data = f.read(size) if len(data) == 0: break r.update(data) partial = r.fingerprints() gold = get_file_fingerprints(TARGET) assert len(gold) == len(partial) == len(reached) for i in range(len(gold)): try: gs, gl, gp = gold[i] ps, pl, pp = partial[i] rs, rl, rp = reached[i] assert gs == ps == rs assert gl == pl == rl assert gp == pp == rp except: print('gold ', gold[i]) print('partial', partial[i]) print('reached', reached[i])