Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/lj_str.c b/src/lj_str.c
- index 6548ee4..128211f 100644
- --- a/src/lj_str.c
- +++ b/src/lj_str.c
- @@ -90,6 +90,41 @@ void lj_str_resize(lua_State *L, MSize newmask)
- g->strhash = newhash;
- }
- +static LJ_AINLINE MSize murmur3_h ( const void * key, MSize len, uintptr_t seed)
- +{
- + const uint8_t * data = (const uint8_t*)key;
- + const uint8_t * tail = (const uint8_t*)data+(len&(~3));
- + const MSize nblocks = len / 4;
- + MSize i;
- + uint32_t h1 = (uint32_t)seed & (uint32_t)(seed >> 16);
- + const uint32_t c1 = 0xcc9e2d51;
- + const uint32_t c2 = 0x1b873593;
- + uint32_t k1;
- + for(i = 0; i < nblocks; i++)
- + {
- + k1 = lj_getu32(data + i*4);
- + k1 *= c1; k1 = lj_rol(k1,15); k1 *= c2;
- + h1 ^= k1; h1 = lj_rol(h1,13); h1 = h1*5+0xe6546b64;
- + }
- +
- + k1 = 0;
- + switch(len & 3)
- + {
- + case 3: k1 ^= tail[2] << 16;
- + case 2: k1 ^= tail[1] << 8;
- + case 1: k1 ^= tail[0];
- + k1 *= c1; k1 = lj_rol(k1,15); k1 *= c2;
- + h1 ^= k1;
- + };
- +
- +
- + h1 ^= len;
- + h1 ^= h1 >> 16; h1 *= 0x85ebca6b;
- + h1 ^= h1 >> 13; h1 *= 0xc2b2ae35;
- + h1 ^= h1 >> 16;
- + return h1;
- +}
- +
- /* Intern a string and return string object. */
- GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
- {
- @@ -97,28 +132,16 @@ GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)
- GCstr *s;
- GCobj *o;
- MSize len = (MSize)lenx;
- - MSize a, b, h = len;
- + MSize h;
- if (lenx >= LJ_MAX_STR)
- lj_err_msg(L, LJ_ERR_STROV);
- g = G(L);
- /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */
- - if (len >= 4) { /* Caveat: unaligned access! */
- - a = lj_getu32(str);
- - h ^= lj_getu32(str+len-4);
- - b = lj_getu32(str+(len>>1)-2);
- - h ^= b; h -= lj_rol(b, 14);
- - b += lj_getu32(str+(len>>2)-1);
- - } else if (len > 0) {
- - a = *(const uint8_t *)str;
- - h ^= *(const uint8_t *)(str+len-1);
- - b = *(const uint8_t *)(str+(len>>1));
- - h ^= b; h -= lj_rol(b, 14);
- + if (len > 0) {
- + h = murmur3_h(str, len, (uintptr_t)g);
- } else {
- return &g->strempty;
- }
- - a ^= h; a -= lj_rol(h, 11);
- - b ^= a; b -= lj_rol(a, 25);
- - h ^= b; h -= lj_rol(b, 16);
- /* Check if the string has already been interned. */
- o = gcref(g->strhash[h & g->strmask]);
- if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement