Revision d50ed8d4 snf-pithos-tools/pithos/tools/lib/hashmap.py
b/snf-pithos-tools/pithos/tools/lib/hashmap.py | ||
---|---|---|
1 | 1 |
# Copyright 2011-2012 GRNET S.A. All rights reserved. |
2 |
#
|
|
2 |
# |
|
3 | 3 |
# Redistribution and use in source and binary forms, with or |
4 | 4 |
# without modification, are permitted provided that the following |
5 | 5 |
# conditions are met: |
6 |
#
|
|
6 |
# |
|
7 | 7 |
# 1. Redistributions of source code must retain the above |
8 | 8 |
# copyright notice, this list of conditions and the following |
9 | 9 |
# disclaimer. |
10 |
#
|
|
10 |
# |
|
11 | 11 |
# 2. Redistributions in binary form must reproduce the above |
12 | 12 |
# copyright notice, this list of conditions and the following |
13 | 13 |
# disclaimer in the documentation and/or other materials |
14 | 14 |
# provided with the distribution. |
15 |
#
|
|
15 |
# |
|
16 | 16 |
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
17 | 17 |
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | 18 |
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
... | ... | |
25 | 25 |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
26 | 26 |
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | 27 |
# POSSIBILITY OF SUCH DAMAGE. |
28 |
#
|
|
28 |
# |
|
29 | 29 |
# The views and conclusions contained in the software and |
30 | 30 |
# documentation are those of the authors and should not be |
31 | 31 |
# interpreted as representing official policies, either expressed |
... | ... | |
38 | 38 |
|
39 | 39 |
from progress.bar import IncrementalBar |
40 | 40 |
|
41 |
|
|
41 | 42 |
def file_read_iterator(fp, size=1024): |
42 | 43 |
while True: |
43 | 44 |
data = fp.read(size) |
... | ... | |
45 | 46 |
break |
46 | 47 |
yield data |
47 | 48 |
|
49 |
|
|
48 | 50 |
class HashMap(list): |
49 |
|
|
51 |
|
|
50 | 52 |
def __init__(self, blocksize, blockhash): |
51 | 53 |
super(HashMap, self).__init__() |
52 | 54 |
self.blocksize = blocksize |
53 | 55 |
self.blockhash = blockhash |
54 |
|
|
56 |
|
|
55 | 57 |
def _hash_raw(self, v): |
56 | 58 |
h = hashlib.new(self.blockhash) |
57 | 59 |
h.update(v) |
58 | 60 |
return h.digest() |
59 |
|
|
61 |
|
|
60 | 62 |
def _hash_block(self, v): |
61 | 63 |
return self._hash_raw(v.rstrip('\x00')) |
62 |
|
|
64 |
|
|
63 | 65 |
def hash(self): |
64 | 66 |
if len(self) == 0: |
65 | 67 |
return self._hash_raw('') |
66 | 68 |
if len(self) == 1: |
67 | 69 |
return self.__getitem__(0) |
68 |
|
|
70 |
|
|
69 | 71 |
h = list(self) |
70 | 72 |
s = 2 |
71 | 73 |
while s < len(h): |
... | ... | |
74 | 76 |
while len(h) > 1: |
75 | 77 |
h = [self._hash_raw(h[x] + h[x + 1]) for x in range(0, len(h), 2)] |
76 | 78 |
return h[0] |
77 |
|
|
79 |
|
|
78 | 80 |
def load(self, fp): |
79 | 81 |
self.size = 0 |
80 | 82 |
file_size = os.fstat(fp.fileno()).st_size |
Also available in: Unified diff