diff --git a/cpp/translate/basictypes/String.cpp b/cpp/translate/basictypes/String.cpp index 09d09f63ac4ec8febe9c1929d0e213d7c3b5d4fb..e1498ae4d82b002122af2a4151e0c77b7d253d79 100644 --- a/cpp/translate/basictypes/String.cpp +++ b/cpp/translate/basictypes/String.cpp @@ -70,14 +70,18 @@ void String::setData(const char *pointer) int String::hashCode() { - int64_t h = hash; - if (hash == 0 && inner.size() > 0) { - for (size_t i = 0; i < inner.size(); ++i) { - h = static_cast(31 * h + static_cast(inner[i])); + size_t usedSize = inner.size(); + if (usedSize == 0) { + return 0; + } + int64_t hash = 0; + for (size_t i = 0; i < usedSize; ++i) { + hash = 31 * hash + static_cast(inner[i]); + if (hash > INT32_MAX || hash < INT32_MIN) { + hash = (int)hash; } - hash = static_cast(h); } - return hash; + return (int)hash; } bool String::equals(Object *obj)