Dali::CalculateHash support to hashing raw-buffer 44/271344/5
authorEunki, Hong <eunkiki.hong@samsung.com>
Fri, 18 Feb 2022 05:57:35 +0000 (14:57 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 23 Feb 2022 03:37:31 +0000 (12:37 +0900)
Current Dali::CalculateHash input std::string, but internally
convert as const char * string.
In this case, hashing calculation didn'w works well
when std::string contain \0 character middle of string.

This patch make one more API s.t. allow std::vector<std::uint8_t>
as input so we can specific the length of data what we want to hash.

It will be used in dali-toolkit texture-cache-manager in soon.

Change-Id: I5ceaeb0cbf1140729d1f0f68930c8cbcd8a18594
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali/utc-Dali-Hash.cpp
dali/devel-api/common/hash.cpp
dali/devel-api/common/hash.h

index 5343f33..f6bf706 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -59,3 +59,69 @@ int UtcDaliHashNegative(void)
 
   END_TEST;
 }
+
+int UtcDaliHashBuffer(void)
+{
+  TestApplication application;
+
+  tet_infoline("UtcDaliHashBuffer");
+
+  const std::vector<std::uint8_t> testBuffer1 = {11, 22, 33, 0, 0};
+  const std::vector<std::uint8_t> testBuffer2 = {11, 22, 33};
+  const std::vector<std::uint8_t> testBuffer3 = {0, 0, 33, 22, 11};
+  const std::vector<std::uint8_t> testBuffer4 = {};
+
+  const std::string testString1 = std::string(testBuffer1.begin(), testBuffer1.end());
+  const std::string testString2 = std::string(testBuffer2.begin(), testBuffer2.end());
+  const std::string testString3 = std::string(testBuffer3.begin(), testBuffer3.end());
+  const std::string testString4 = std::string(testBuffer4.begin(), testBuffer4.end());
+
+  tet_printf("const char * type terminate by \\0 char. we cannot seperate two buffer only by std::string().c_str()\n");
+  DALI_TEST_CHECK(Dali::CalculateHash(testString1) == Dali::CalculateHash(testString2));
+  DALI_TEST_CHECK(Dali::CalculateHash(testString3) == Dali::CalculateHash(testString4));
+
+  tet_printf("To fix this limitation, we make one more API for hashing std::vector<std::uint8_t>\n");
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer2));
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer3));
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer4));
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer3));
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer4));
+  DALI_TEST_CHECK(Dali::CalculateHash(testBuffer3) != Dali::CalculateHash(testBuffer4));
+
+  END_TEST;
+}
+
+int UtcDaliHashBuffer02(void)
+{
+  TestApplication application;
+
+  tet_infoline("UtcDaliHashBuffer02");
+  tet_infoline("Same string must have same hash value. even though generated by std::string and std::vector<std::uint8_t>.");
+
+  const std::string               testString("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
+  const std::vector<std::uint8_t> testBuffer = std::vector<std::uint8_t>(testString.begin(), testString.end());
+
+  DALI_TEST_CHECK(Dali::CalculateHash(testString) == Dali::CalculateHash(testBuffer));
+
+  END_TEST;
+}
+
+int UtcDaliHashBufferNegative(void)
+{
+  // negative test, check hash value == initial value
+  const std::vector<std::uint8_t> emptyBuffer;
+  const std::vector<std::uint8_t> notEmptyBuffer1{0};
+  const std::vector<std::uint8_t> notEmptyBuffer2{0, 0};
+
+  // Check with zero-only buffers also did not zero.
+  DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != 0);
+  DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != 0);
+  DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer2) != 0);
+
+  // Check with zero-only buffers with difference lengths have difference value each other.
+  DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer1));
+  DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer2));
+  DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != Dali::CalculateHash(notEmptyBuffer2));
+
+  END_TEST;
+}
\ No newline at end of file
index d510013..d59d112 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -43,6 +43,14 @@ inline void HashString(const char* string, std::size_t& hash, char terminator)
   }
 }
 
+inline void HashBuffer(const std::vector<std::uint8_t>& buffer, std::size_t& hash)
+{
+  for(const auto& c : buffer)
+  {
+    hash = hash * 33 + c;
+  }
+}
+
 } // unnamed namespace
 
 std::size_t CalculateHash(const std::string& toHash)
@@ -73,4 +81,13 @@ std::size_t CalculateHash(const std::string& string1, const std::string& string2
   return hash;
 }
 
+std::size_t CalculateHash(const std::vector<std::uint8_t>& toHash)
+{
+  std::size_t hash(INITIAL_HASH_VALUE);
+
+  HashBuffer(toHash, hash);
+
+  return hash;
+}
+
 } // namespace Dali
index 4665102..5c78f1a 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_HASH
 
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 // EXTERNAL INCLUDES
 #include <string>
+#include <vector>
 
 //INTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
@@ -55,6 +56,13 @@ DALI_CORE_API std::size_t CalculateHash(const std::string& string1, const std::s
  */
 DALI_CORE_API std::size_t CalculateHash(const std::string& toHash, char terminator);
 
+/**
+ * @brief Create a hash code for a std::vector<std::uint8_t>
+ * @param toHash list of std::uint8_t to hash
+ * @return hash code
+ */
+DALI_CORE_API std::size_t CalculateHash(const std::vector<std::uint8_t>& toHash);
+
 } // namespace Dali
 
 #endif // DALI_HASH