diff options
-rw-r--r-- | pyanidb/hash.py | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/pyanidb/hash.py b/pyanidb/hash.py index 4aab45f..9727ca2 100644 --- a/pyanidb/hash.py +++ b/pyanidb/hash.py @@ -1,9 +1,39 @@ -import multihash, threading, time, os +import threading, time, os, hashlib try: import xattr except ImportError: xattr = None +class Hash: + def __init__(self, filename, algorithms): + update_list = [getattr(self, 'update_%s' % a) for a in algorithms] + self.md4_partial = hashlib.new('md4') + self.md4_final = hashlib.new('md4') + self.size_total = 0 + f = open(filename) + data = f.read(131072) + while data: + for u in update_list: + u(data) + data = f.read(131072) + + def update_ed2k(self, data): + pos = 0 + while pos < len(data): + if (not (self.size_total % 9728000)) and self.size_total: + self.md4_final.update(self.md4_partial.digest()) + self.md4_partial = hashlib.new('md4') + size = min(len(data) - pos, 9728000 - (self.size_total % 9728000)) + self.md4_partial.update(data[pos:pos + size]) + pos += size + self.size_total += size + + def ed2k(self): + if self.size_total > 9728000: + self.md4_final.update(self.md4_partial.digest()) + return self.md4_final.hexdigest() + return self.md4_partial.hexdigest() + class File: def __init__(self, name, algorithms, cache): self.name = name @@ -14,7 +44,7 @@ class File: self.read_cache() if False in [hasattr(self, a) for a in algorithms]: self.cached = False - h = multihash.hash_file(name, algorithms) + h = Hash(name, algorithms) for a in algorithms: setattr(self, a, getattr(h, a)()) self.write_cache() |