summaryrefslogtreecommitdiff
path: root/ThirdParty/hash-library/digest.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-29 18:48:10 +0800
committerchai <chaifix@163.com>2021-10-29 18:48:10 +0800
commit2381fe08be1a0c99d9541761b85064b8ece3f253 (patch)
tree5f04464b7c2ebf3d718b61e959d23f903dd4c6b0 /ThirdParty/hash-library/digest.cpp
parent796b4b05ec62eb5d58a634854998f485072e8a2b (diff)
+md5
Diffstat (limited to 'ThirdParty/hash-library/digest.cpp')
-rw-r--r--ThirdParty/hash-library/digest.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/ThirdParty/hash-library/digest.cpp b/ThirdParty/hash-library/digest.cpp
new file mode 100644
index 0000000..fb0b776
--- /dev/null
+++ b/ThirdParty/hash-library/digest.cpp
@@ -0,0 +1,109 @@
+// //////////////////////////////////////////////////////////
+// digest.cpp
+// Copyright (c) 2014,2015 Stephan Brumme. All rights reserved.
+// see http://create.stephan-brumme.com/disclaimer.html
+//
+
+// g++ -O3 digest.cpp crc32.cpp md5.cpp sha1.cpp sha256.cpp keccak.cpp sha3.cpp -o digest
+
+#include "crc32.h"
+#include "md5.h"
+#include "sha1.h"
+#include "sha256.h"
+#include "keccak.h"
+#include "sha3.h"
+
+#include <iostream>
+#include <fstream>
+
+int main(int argc, char** argv)
+{
+ // syntax check
+ if (argc < 2 || argc > 3)
+ {
+ std::cout << "./digest filename [--crc|--md5|--sha1|--sha256|--keccak|--sha3]" << std::endl;
+ return 1;
+ }
+
+ // parameters
+ std::string filename = argv[1];
+ std::string algorithm = argc == 3 ? argv[2] : "";
+ bool computeCrc32 = algorithm.empty() || algorithm == "--crc";
+ bool computeMd5 = algorithm.empty() || algorithm == "--md5";
+ bool computeSha1 = algorithm.empty() || algorithm == "--sha1";
+ bool computeSha2 = algorithm.empty() || algorithm == "--sha2" || algorithm == "--sha256";
+ bool computeKeccak = algorithm.empty() || algorithm == "--keccak";
+ bool computeSha3 = algorithm.empty() || algorithm == "--sha3";
+
+ CRC32 digestCrc32;
+ MD5 digestMd5;
+ SHA1 digestSha1;
+ SHA256 digestSha2;
+ Keccak digestKeccak(Keccak::Keccak256);
+ SHA3 digestSha3 (SHA3 ::Bits256);
+
+ // select input source: either file or standard-in
+ std::ifstream file;
+ std::istream* input = NULL;
+ // accept std::cin, syntax will be: "./digest - --sha3 < data"
+ if (filename == "-")
+ {
+ input = &std::cin;
+ }
+ else
+ {
+ // open file
+ file.open(filename.c_str(), std::ios::in | std::ios::binary);
+ if (!file)
+ {
+ std::cerr << "Can't open '" << filename << "'" << std::endl;
+ return 2;
+ }
+
+ input = &file;
+ }
+
+ // each cycle processes about 1 MByte (divisible by 144 => improves Keccak/SHA3 performance)
+ const size_t BufferSize = 144*7*1024;
+ char* buffer = new char[BufferSize];
+
+ // process file
+ while (*input)
+ {
+ input->read(buffer, BufferSize);
+ std::size_t numBytesRead = size_t(input->gcount());
+
+ if (computeCrc32)
+ digestCrc32 .add(buffer, numBytesRead);
+ if (computeMd5)
+ digestMd5 .add(buffer, numBytesRead);
+ if (computeSha1)
+ digestSha1 .add(buffer, numBytesRead);
+ if (computeSha2)
+ digestSha2 .add(buffer, numBytesRead);
+ if (computeKeccak)
+ digestKeccak.add(buffer, numBytesRead);
+ if (computeSha3)
+ digestSha3 .add(buffer, numBytesRead);
+ }
+
+ // clean up
+ file.close();
+ delete[] buffer;
+
+ // show results
+ if (computeCrc32)
+ std::cout << "CRC32: " << digestCrc32 .getHash() << std::endl;
+ if (computeMd5)
+ std::cout << "MD5: " << digestMd5 .getHash() << std::endl;
+ if (computeSha1)
+ std::cout << "SHA1: " << digestSha1 .getHash() << std::endl;
+ if (computeSha2)
+ std::cout << "SHA2/256: " << digestSha2 .getHash() << std::endl;
+ if (computeKeccak)
+ std::cout << "Keccak/256: " << digestKeccak.getHash() << std::endl;
+ if (computeSha3)
+ std::cout << "SHA3/256: " << digestSha3 .getHash() << std::endl;
+
+ return 0;
+}