[llvm] cd28003 - [Support] Update `MD5` to follow other hashes.

Alexandre Rames via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 19 14:13:18 PDT 2021


Author: Alexandre Rames
Date: 2021-08-19T14:13:14-07:00
New Revision: cd28003336c7ada59f889cb92ee121d508e076d6

URL: https://github.com/llvm/llvm-project/commit/cd28003336c7ada59f889cb92ee121d508e076d6
DIFF: https://github.com/llvm/llvm-project/commit/cd28003336c7ada59f889cb92ee121d508e076d6.diff

LOG: [Support] Update `MD5` to follow other hashes.

Introduce `StringRef final()` and `StringRef result()`.

Reviewed By: dexonsmith

Differential Revision: https://reviews.llvm.org/D107781

Added: 
    

Modified: 
    llvm/include/llvm/Support/MD5.h
    llvm/lib/Support/MD5.cpp
    llvm/unittests/Support/MD5Test.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Support/MD5.h b/llvm/include/llvm/Support/MD5.h
index c19f6989fe25e..3b960cd4fd880 100644
--- a/llvm/include/llvm/Support/MD5.h
+++ b/llvm/include/llvm/Support/MD5.h
@@ -78,6 +78,14 @@ class MD5 {
   /// Finishes off the hash and puts the result in result.
   void final(MD5Result &Result);
 
+  /// Finishes off the hash, and returns a reference to the 16-byte hash data.
+  StringRef final();
+
+  /// Finishes off the hash, and returns a reference to the 16-byte hash data.
+  /// This is suitable for getting the MD5 at any time without invalidating the
+  /// internal state, so that more calls can be made into `update`.
+  StringRef result();
+
   /// Translates the bytes in \p Res to a hex string that is
   /// deposited into \p Str. The result will be of length 32.
   static void stringifyResult(MD5Result &Result, SmallString<32> &Str);
@@ -101,6 +109,8 @@ class MD5 {
     MD5_u32plus block[16];
   } InternalState;
 
+  MD5Result Result;
+
   const uint8_t *body(ArrayRef<uint8_t> Data);
 };
 

diff  --git a/llvm/lib/Support/MD5.cpp b/llvm/lib/Support/MD5.cpp
index a2612b0c19ace..9dceb4d418cde 100644
--- a/llvm/lib/Support/MD5.cpp
+++ b/llvm/lib/Support/MD5.cpp
@@ -262,6 +262,23 @@ void MD5::final(MD5Result &Result) {
   support::endian::write32le(&Result[12], InternalState.d);
 }
 
+StringRef MD5::final() {
+  final(Result);
+  return StringRef(reinterpret_cast<char *>(Result.Bytes.data()),
+                   Result.Bytes.size());
+}
+
+StringRef MD5::result() {
+  auto StateToRestore = InternalState;
+
+  auto Hash = final();
+
+  // Restore the state
+  InternalState = StateToRestore;
+
+  return Hash;
+}
+
 SmallString<32> MD5::MD5Result::digest() const {
   SmallString<32> Str;
   raw_svector_ostream Res(Str);

diff  --git a/llvm/unittests/Support/MD5Test.cpp b/llvm/unittests/Support/MD5Test.cpp
index 3a24e1fa69796..8eb4d3422cb62 100644
--- a/llvm/unittests/Support/MD5Test.cpp
+++ b/llvm/unittests/Support/MD5Test.cpp
@@ -68,4 +68,35 @@ TEST(MD5HashTest, MD5) {
   EXPECT_EQ(0x3be167ca6c49fb7dULL, MD5Res.high());
   EXPECT_EQ(0x00e49261d7d3fcc3ULL, MD5Res.low());
 }
+
+TEST(MD5Test, FinalAndResultHelpers) {
+  MD5 Hash;
+
+  Hash.update("abcd");
+
+  {
+    MD5 ReferenceHash;
+    ReferenceHash.update("abcd");
+    MD5::MD5Result ReferenceResult;
+    ReferenceHash.final(ReferenceResult);
+    StringRef ExpectedResult =
+        StringRef(reinterpret_cast<char *>(ReferenceResult.Bytes.data()),
+                  ReferenceResult.Bytes.size());
+    EXPECT_EQ(Hash.result(), ExpectedResult);
+  }
+
+  Hash.update("xyz");
+
+  {
+    MD5 ReferenceHash;
+    ReferenceHash.update("abcd");
+    ReferenceHash.update("xyz");
+    MD5::MD5Result ReferenceResult;
+    ReferenceHash.final(ReferenceResult);
+    StringRef ExpectedResult =
+        StringRef(reinterpret_cast<char *>(ReferenceResult.Bytes.data()),
+                  ReferenceResult.Bytes.size());
+    EXPECT_EQ(Hash.final(), ExpectedResult);
+  }
 }
+} // namespace


        


More information about the llvm-commits mailing list