From 67d642450e7d40efa8fc5d7a0e506a0b9bbdf4bc Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Fri, 31 May 2013 22:34:56 +0000 Subject: [PATCH] Add support for adding the contents of a StringRef to the MD5 hash. llvm-svn: 183054 --- include/llvm/Support/MD5.h | 5 ++++- lib/Support/MD5.cpp | 8 ++++++++ unittests/Support/MD5Test.cpp | 21 +++++++++++++++------ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/llvm/Support/MD5.h b/include/llvm/Support/MD5.h index 38bdbaebbb7..b2b8c2d55b8 100644 --- a/include/llvm/Support/MD5.h +++ b/include/llvm/Support/MD5.h @@ -49,9 +49,12 @@ public: MD5(); - /// \brief Updates the hash for arguments provided. + /// \brief Updates the hash for the byte stream provided. void update(ArrayRef Data); + /// \brief Updates the hash for the StringRef provided. + void update(StringRef Str); + /// \brief Finishes off the hash and puts the result in result. void final(MD5Result &result); diff --git a/lib/Support/MD5.cpp b/lib/Support/MD5.cpp index 8f180684ff6..514466c750f 100644 --- a/lib/Support/MD5.cpp +++ b/lib/Support/MD5.cpp @@ -219,6 +219,14 @@ void MD5::update(ArrayRef Data) { memcpy(buffer, Ptr, Size); } +/// Add the bytes in the StringRef \p Str to the hash. +// Note that this isn't a string and so this won't include any trailing NULL +// bytes. +void MD5::update(StringRef Str) { + ArrayRef SVal((const uint8_t *)Str.data(), Str.size()); + update(SVal); +} + /// \brief Finish the hash and place the resulting hash into \p result. /// \param result is assumed to be a minimum of 16-bytes in size. void MD5::final(MD5Result &result) { diff --git a/unittests/Support/MD5Test.cpp b/unittests/Support/MD5Test.cpp index c5658ec4976..7c1331b6c53 100644 --- a/unittests/Support/MD5Test.cpp +++ b/unittests/Support/MD5Test.cpp @@ -30,22 +30,31 @@ void TestMD5Sum(ArrayRef Input, StringRef Final) { EXPECT_EQ(Res, Final); } +void TestMD5Sum(StringRef Input, StringRef Final) { + MD5 Hash; + Hash.update(Input); + MD5::MD5Result MD5Res; + Hash.final(MD5Res); + SmallString<32> Res; + MD5::stringifyResult(MD5Res, Res); + EXPECT_EQ(Res, Final); +} + TEST(MD5Test, MD5) { TestMD5Sum(ArrayRef((const uint8_t *)"", (size_t) 0), "d41d8cd98f00b204e9800998ecf8427e"); TestMD5Sum(ArrayRef((const uint8_t *)"a", (size_t) 1), "0cc175b9c0f1b6a831c399e269772661"); - TestMD5Sum(ArrayRef( - (const uint8_t *)"abcdefghijklmnopqrstuvwxyz", - (size_t) 26), + TestMD5Sum(ArrayRef((const uint8_t *)"abcdefghijklmnopqrstuvwxyz", + (size_t) 26), "c3fcd3d76192e4007dfb496cca67e13b"); TestMD5Sum(ArrayRef((const uint8_t *)"\0", (size_t) 1), "93b885adfe0da089cdf634904fd59f71"); TestMD5Sum(ArrayRef((const uint8_t *)"a\0", (size_t) 2), "4144e195f46de78a3623da7364d04f11"); - TestMD5Sum(ArrayRef( - (const uint8_t *)"abcdefghijklmnopqrstuvwxyz\0", - (size_t) 27), + TestMD5Sum(ArrayRef((const uint8_t *)"abcdefghijklmnopqrstuvwxyz\0", + (size_t) 27), "81948d1f1554f58cd1a56ebb01f808cb"); + TestMD5Sum("abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b"); } }