Advertisement
funny_falcon

lj_str.diff

Jul 18th, 2013
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.32 KB | None | 0 0
  1. diff --git a/src/lj_str.c b/src/lj_str.c
  2. index 6548ee4..128211f 100644
  3. --- a/src/lj_str.c
  4. +++ b/src/lj_str.c
  5. @@ -90,6 +90,41 @@ void lj_str_resize(lua_State *L, MSize newmask)
  6.    g->strhash = newhash;
  7.  }
  8.  
  9. +static LJ_AINLINE MSize murmur3_h ( const void * key, MSize len, uintptr_t seed)
  10. +{
  11. +  const uint8_t * data = (const uint8_t*)key;
  12. +  const uint8_t * tail = (const uint8_t*)data+(len&(~3));
  13. +  const MSize nblocks = len / 4;
  14. +  MSize i;
  15. +  uint32_t h1 = (uint32_t)seed & (uint32_t)(seed >> 16);
  16. +  const uint32_t c1 = 0xcc9e2d51;
  17. +  const uint32_t c2 = 0x1b873593;
  18. +  uint32_t k1;
  19. +  for(i = 0; i < nblocks; i++)
  20. +  {
  21. +    k1 = lj_getu32(data + i*4);
  22. +    k1 *= c1; k1 = lj_rol(k1,15); k1 *= c2;
  23. +    h1 ^= k1; h1 = lj_rol(h1,13); h1 = h1*5+0xe6546b64;
  24. +  }
  25. +
  26. +  k1 = 0;
  27. +  switch(len & 3)
  28. +  {
  29. +  case 3: k1 ^= tail[2] << 16;
  30. +  case 2: k1 ^= tail[1] << 8;
  31. +  case 1: k1 ^= tail[0];
  32. +      k1 *= c1; k1 = lj_rol(k1,15); k1 *= c2;
  33. +      h1 ^= k1;
  34. +  };
  35. +
  36. +
  37. +  h1 ^= len;
  38. +  h1 ^= h1 >> 16; h1 *= 0x85ebca6b;
  39. +  h1 ^= h1 >> 13; h1 *= 0xc2b2ae35;
  40. +  h1 ^= h1 >> 16;
  41. +  return h1;
  42. +}
  43. +
  44.  /* Intern a string and return string object. */
  45.  GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
  46.  {
  47. @@ -97,28 +132,16 @@ GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
  48.    GCstr *s;
  49.    GCobj *o;
  50.    MSize len = (MSize)lenx;
  51. -  MSize a, b, h = len;
  52. +  MSize h;
  53.    if (lenx >= LJ_MAX_STR)
  54.      lj_err_msg(L, LJ_ERR_STROV);
  55.    g = G(L);
  56.    /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */
  57. -  if (len >= 4) {  /* Caveat: unaligned access! */
  58. -    a = lj_getu32(str);
  59. -    h ^= lj_getu32(str+len-4);
  60. -    b = lj_getu32(str+(len>>1)-2);
  61. -    h ^= b; h -= lj_rol(b, 14);
  62. -    b += lj_getu32(str+(len>>2)-1);
  63. -  } else if (len > 0) {
  64. -    a = *(const uint8_t *)str;
  65. -    h ^= *(const uint8_t *)(str+len-1);
  66. -    b = *(const uint8_t *)(str+(len>>1));
  67. -    h ^= b; h -= lj_rol(b, 14);
  68. +  if (len > 0) {
  69. +    h = murmur3_h(str, len, (uintptr_t)g);
  70.    } else {
  71.      return &g->strempty;
  72.    }
  73. -  a ^= h; a -= lj_rol(h, 11);
  74. -  b ^= a; b -= lj_rol(a, 25);
  75. -  h ^= b; h -= lj_rol(b, 16);
  76.    /* Check if the string has already been interned. */
  77.    o = gcref(g->strhash[h & g->strmask]);
  78.    if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement