diff options
-rw-r--r-- | multihash/__init__.py | 9 | ||||
-rw-r--r-- | src/hash.cpp | 8 | ||||
-rw-r--r-- | src/hash.h | 4 | ||||
-rw-r--r-- | src/wrapper.cpp | 2 |
4 files changed, 21 insertions, 2 deletions
diff --git a/multihash/__init__.py b/multihash/__init__.py index 5e30186..9be422f 100644 --- a/multihash/__init__.py +++ b/multihash/__init__.py @@ -1,4 +1,4 @@ -from _multihash import CRC32, Ed2k, MD5, SHA1 +from _multihash import CRC32, Ed2k, MD5, SHA1, _hash_file hashes = { 'crc32': CRC32, @@ -15,3 +15,10 @@ class Multihash: h = hashes[hash](h) setattr(self, hash, h.digest) self.update = h.update + self.first = h + +def hash_file(name, *args): + f = open(name) + h = Multihash() + _hash_file(f.fileno(), h.first) + return h
\ No newline at end of file diff --git a/src/hash.cpp b/src/hash.cpp index 89b14cc..82df4c0 100644 --- a/src/hash.cpp +++ b/src/hash.cpp @@ -60,4 +60,12 @@ namespace Multihash { std::string Hash::hash_digest() { throw std::runtime_error("Not implemented."); } + + void _hash_file(int fileno, Hash* hash) { + char buf[32768]; + int s; + while((s = read(fileno, buf, 32768)) > 0) { + hash->_update(buf, s); + } + } } @@ -13,15 +13,17 @@ namespace Multihash { private: std::string digest_str; Hash* next; - void _update(const char* data, int length); protected: virtual void hash_update(const char* data, int length); virtual std::string hash_digest(); public: Hash(Hash* n = 0); void update(std::string data); + void _update(const char* data, int length); std::string digest(); }; + + void _hash_file(int fileno, Hash* hash); } #endif // _HASH_H_ diff --git a/src/wrapper.cpp b/src/wrapper.cpp index cbe86f5..a93dae2 100644 --- a/src/wrapper.cpp +++ b/src/wrapper.cpp @@ -26,4 +26,6 @@ BOOST_PYTHON_MODULE(_multihash) class_<Multihash::SHA1, bases<Hash> >("SHA1") .def(init<optional<Hash*> >()); + + def("_hash_file", Multihash::_hash_file); } |