diff --git a/src/utils/StringUtils.hh b/src/utils/StringUtils.hh
index badcd8c8c6b33c4261f26f9684a122ce8c3295cc..7002939639ff74c44ffc24e5e0168940f8613f03 100644
--- a/src/utils/StringUtils.hh
+++ b/src/utils/StringUtils.hh
@@ -52,6 +52,16 @@ inline bool startsWith(std::string_view str, std::string_view prefix) {
   return true;
 }
 
+inline bool endsWith(std::string_view str, std::string_view suffix) {
+  if(suffix.size() > str.size()) return false;
+
+  for(size_t i = 0; i < suffix.size(); i++) {
+    if(str[str.size()-suffix.size()+i] != suffix[i]) return false;
+  }
+
+  return true;
+}
+
 inline bool isPrefix(const std::string &prefix, const char *buff, size_t n) {
   if(n < prefix.size()) return false;
 
diff --git a/test/utils.cc b/test/utils.cc
index 2f3f61b9e30f05070c5f7a9518136c4a1f107561..f6bad1c777e98a27cfcfb0ed2ff2b6241f97ad8e 100644
--- a/test/utils.cc
+++ b/test/utils.cc
@@ -1103,4 +1103,16 @@ TEST(Synchronized, String) {
   ASSERT_EQ(syncstr.get(), "");
   syncstr.set("test");
   ASSERT_EQ(syncstr.get(), "test");
+}
+
+TEST(StringUtils, endsWith) {
+  ASSERT_TRUE(StringUtils::endsWith("some-string-123", "3"));
+  ASSERT_TRUE(StringUtils::endsWith("some-string-123", "123"));
+  ASSERT_TRUE(StringUtils::endsWith("some-string-123", "-123"));
+  ASSERT_TRUE(StringUtils::endsWith("some-string-123", "string-123"));
+
+  ASSERT_FALSE(StringUtils::endsWith("some-string-123", "4"));
+  ASSERT_FALSE(StringUtils::endsWith("some-string-123", "124"));
+  ASSERT_FALSE(StringUtils::endsWith("some-string-123", "-124"));
+  ASSERT_FALSE(StringUtils::endsWith("some-string-123", "strin4-123"));
 }
\ No newline at end of file