Optimising GetHashCode()
authordarpan.ka <darpan.ka@samsung.com>
Wed, 28 Aug 2013 02:23:41 +0000 (11:23 +0900)
committerdarpan.ka <darpan.ka@samsung.com>
Tue, 3 Sep 2013 02:58:39 +0000 (11:58 +0900)
Change-Id: I8a2f4b3dcc9d011b2983625ad0d41ea0f94675bf
Signed-off-by: darpan.ka <darpan.ka@samsung.com>
src/base/FBaseString.cpp

index bf69291..64b28e8 100644 (file)
@@ -284,7 +284,6 @@ String::operator ==(const String& rhs) const
        {
                return false;
        }
-
        return(CompareTo(rhs) == 0);
 }
 
@@ -558,23 +557,29 @@ String::Format(int length, const wchar_t* pFormat, ...)
 int
 String::GetHashCode(void) const
 {
-       int hash = 0;
+       if (__length == 0)
+       {
+               return 0;
+       }
 
        if (__hash == 0)
        {
+               const int DEFAULT_HASH_VALUE = 352654597;
+               const int HASH_MULTIPLIER = 1566083941;
+
+               int num = DEFAULT_HASH_VALUE;
+               int num2 = DEFAULT_HASH_VALUE;
                wchar_t* pStr = __pValue;
-               for (int i = 0; i < __length; ++i)
+               for (int i = __length; i >= 2 ; i -= 4)
                {
-                       hash = (hash << 5) - hash + (int) *pStr++;
+                   num = (((num << 5) + num) + (num >> 27)) ^ pStr[0];
+                   num2 = (((num2 << 5) + num2) + (num2 >> 27)) ^ pStr[1];
+                   pStr += 2;
                }
-               __hash = hash;
+               num = (((num << 5) + num) + (num >> 27)) ^ pStr[0];
+               __hash = num + (num2 * HASH_MULTIPLIER);
        }
-       else
-       {
-               hash = __hash;
-       }
-
-       return hash;
+       return __hash;
 }
 
 result