Opened 10 years ago
Closed 10 years ago
#7128 closed Bugs (fixed)
boost::uuids::detail::sha1 computes incorrect result
Reported by: | anonymous | Owned by: | Andy Tompkins |
---|---|---|---|
Milestone: | To Be Determined | Component: | uuid |
Version: | Boost 1.50.0 | Severity: | Problem |
Keywords: | sha1 | Cc: | jack.wgm@… |
Description
I found a problem when hash a large file in linux. my file size is: 1,545,746,148bytes boost :: uuids :: detail :: sha1 very serious problem, hope can fix this problem.
Change History (5)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
#include <iostream> #include <string> #include <boost/shared_array.hpp> #include <boost/uuid/sha1.hpp> #include <boost/smart_ptr/scoped_ptr.hpp> #include <boost/iostreams/device/file.hpp> std::string sha1_to_string(const char *hash) { char str[128] = { 0 }; char *ptr = str; std::string ret; for (int i = 0; i < 20; i++) { sprintf(ptr, "%02X", (unsigned char)*hash); ptr += 2; hash++; } ret = str; return ret; } int main(int argc, char **argv) { if (argc != 2) { return -1; } boost::uuids::detail::sha1 hasher; boost::shared_array<unsigned int> digest; boost::shared_array<char> temp_buf(new char[5242880]); boost::scoped_ptr<boost::iostreams::file> file_ptr( new boost::iostreams::file(argv[1], BOOST_IOS::out|BOOST_IOS::in|BOOST_IOS::binary)); if (!file_ptr->is_open()) return -1; while (true) { std::streamsize readbytes = file_ptr->read(temp_buf.get(), 5242880); if (readbytes <= 0) break; hasher.process_bytes(temp_buf.get(), readbytes); } file_ptr.reset(); digest.reset(new unsigned int [5]); char bin[20]; hasher.get_digest(reinterpret_cast<boost::uuids::detail::sha1::digest_type>(*digest.get())); for(int i = 0; i < 5; ++i) { const char* tmp = reinterpret_cast<char*>(digest.get()); bin[i * 4 ] = tmp[i * 4 + 3]; bin[i * 4 + 1] = tmp[i * 4 + 2]; bin[i * 4 + 2] = tmp[i * 4 + 1]; bin[i * 4 + 3] = tmp[i * 4 ]; } std::string hash_hex = sha1_to_string(bin); // output hex digest std::cout << hash_hex.c_str() << std::endl; return 0; }
run program:
[root@media-coder test]# g++ test.cpp [root@coder test]# ./a.out dump.rmvb 3A383A31E5B447A0614361D7E6931FE29BA9519E [root@coder test]# sha1sum dump.rmvb ad74ded3e3cbea7f02997d51e79e887e596ed787 dump.rmvb
comment:4 by , 10 years ago
comment:5 by , 10 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
fixed in release - changeset #80954
Note:
See TracTickets
for help on using tickets.
Release commit 76405 updated the sh1 algorithm to handle messages as long as the specification (264 bits). See ticket #5325https://svn.boost.org/trac/boost/ticket/5325. It should handle your file.
Can you show your program?