WoW:USERAPI StringHash: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
(→‎Code: "mod" -> "math.mod" so it works outside of wow)
 
(→‎Code: W/ the 2.0 changes, lua 5.1 renamed math.mod to math.fmod)
Line 35: Line 35:
   local len = string.len(text);  
   local len = string.len(text);  
   for i = 1, len, 3 do  
   for i = 1, len, 3 do  
     counter = math.mod(counter*8161, 4294967279) +  -- 2^32 - 17: Prime!
     counter = math.fmod(counter*8161, 4294967279) +  -- 2^32 - 17: Prime!
     (string.byte(text,i)*16776193) +
     (string.byte(text,i)*16776193) +
     ((string.byte(text,i+1) or (len-i+256))*8372226) +
     ((string.byte(text,i+1) or (len-i+256))*8372226) +
     ((string.byte(text,i+2) or (len-i+256))*3932164);
     ((string.byte(text,i+2) or (len-i+256))*3932164);
   end;  
   end;  
   return math.mod(counter, 4294967291); -- 2^32 - 5: Prime (and different from the prime in the loop)
   return math.fmod(counter, 4294967291); -- 2^32 - 5: Prime (and different from the prime in the loop)
  end
  end



Revision as of 21:41, 12 January 2007

This page documents a user-defined function that you can copy and paste into your addon. Replace PREFIX with your addon or lib prefix to avoid conflicts between different versions of these functions.

User defined functions

StringHash - by Template:User -


Return a fair-quality 32-bit hash of a string

hashVal = <PREFIX>_StringHash("string")


Example

> print(PREFIX_StringHash(""))
1 
> print(<PREFIX>_StringHash("ab"))
3458343178
> print(<PREFIX>_StringHash("ba"))
3466747145
> print(<PREFIX>_StringHash("AB"))
2653593770
> print(<PREFIX>_StringHash("BA"))
2661997737
> print(<PREFIX>_StringHash("The quick brown fox jumps over the lazy dog"))
3402772626

Details

  • This algorithm is ~30% faster than a Lua implementation of the Java String.hashCode library call
  • The bit transmutation patterns and resulting collision rates are MUCH better than the results from the Java hash

Code

function <PREFIX>_StringHash(text)
  local counter = 1;
  local len = string.len(text); 
  for i = 1, len, 3 do 
    counter = math.fmod(counter*8161, 4294967279) +  -- 2^32 - 17: Prime!
  	  (string.byte(text,i)*16776193) +
  	  ((string.byte(text,i+1) or (len-i+256))*8372226) +
  	  ((string.byte(text,i+2) or (len-i+256))*3932164);
  end; 
  return math.fmod(counter, 4294967291); -- 2^32 - 5: Prime (and different from the prime in the loop)
end