summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2016-03-17 19:47:46 +0200
committerLars Wirzenius <liw@liw.fi>2016-03-17 20:56:59 +0200
commit4210f10e6e786d8908f3d9872edf3cd61b9d224c (patch)
tree7789cf5e021270d6167946971483f93494c3cec8
parentfea456ea4005bb740014fd2e2702ec43ebb8399c (diff)
downloadobnam-4210f10e6e786d8908f3d9872edf3cd61b9d224c.tar.gz
Compute faster whole-file checksum for non-MD5
-rw-r--r--obnamlib/whole_file_checksummer.py9
-rw-r--r--obnamlib/whole_file_checksummer_tests.py13
2 files changed, 15 insertions, 7 deletions
diff --git a/obnamlib/whole_file_checksummer.py b/obnamlib/whole_file_checksummer.py
index b08655b9..0c49e05d 100644
--- a/obnamlib/whole_file_checksummer.py
+++ b/obnamlib/whole_file_checksummer.py
@@ -36,6 +36,7 @@ class WholeFileCheckSummer(object):
'''
def __init__(self, file_key):
+ self._all_bytes = file_key == obnamlib.REPO_FILE_MD5
self._summer = self._create_checksum_algorithm(file_key)
def _create_checksum_algorithm(self, file_key):
@@ -44,8 +45,12 @@ class WholeFileCheckSummer(object):
name = obnamlib.get_checksum_algorithm_name(file_key)
return obnamlib.get_checksum_algorithm(name)
- def append_chunk(self, chunk_data, token):
- self._summer.update(chunk_data)
+ def append_chunk(self, chunk_data, chunk_id):
+ if self._all_bytes:
+ self._summer.update(chunk_data)
+ else:
+ thing = '{},{};'.format(len(chunk_data), chunk_id)
+ self._summer.update(thing)
def get_checksum(self):
'''Get the current whole-file checksum.'''
diff --git a/obnamlib/whole_file_checksummer_tests.py b/obnamlib/whole_file_checksummer_tests.py
index c06becab..0b9c7b9f 100644
--- a/obnamlib/whole_file_checksummer_tests.py
+++ b/obnamlib/whole_file_checksummer_tests.py
@@ -16,6 +16,7 @@
# =*= License: GPL-3+ =*=
+import hashlib
import unittest
import obnamlib
@@ -36,6 +37,7 @@ class WholeFileCheckSummerTests(unittest.TestCase):
summer = obnamlib.WholeFileCheckSummer(obnamlib.REPO_FILE_MD5)
chunk = 'hello'
token = repo.prepare_chunk_for_indexes(chunk)
+ chunk_id = None
summer.append_chunk(chunk, token)
self.assertEqual(
summer.get_checksum(),
@@ -46,11 +48,12 @@ class WholeFileCheckSummerTests(unittest.TestCase):
summer = obnamlib.WholeFileCheckSummer(obnamlib.REPO_FILE_SHA512)
chunk = 'hello'
token = repo.prepare_chunk_for_indexes(chunk)
- summer.append_chunk(chunk, token)
- self.assertEqual(
- summer.get_checksum(),
- '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca7'
- '2323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043')
+ chunk_id = '123'
+ summer.append_chunk(chunk, chunk_id)
+
+ expected = hashlib.sha512('{},{};'.format(len(chunk), chunk_id))
+
+ self.assertEqual(summer.get_checksum(), expected.hexdigest())
class FakeRepository(object):