-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0fcd413
commit cd8d87f
Showing
2 changed files
with
91 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
// Copied from https://github.com/emotion-js/emotion/blob/master/packages/hash/src/index.js | ||
|
||
const murmur2 = (str) => { | ||
// 'm' and 'r' are mixing constants generated offline. | ||
// They're not really 'magic', they just happen to work well. | ||
|
||
// const m = 0x5bd1e995; | ||
// const r = 24; | ||
|
||
// Initialize the hash | ||
|
||
var h = 0; | ||
|
||
// Mix 4 bytes at a time into the hash | ||
|
||
var k, | ||
i = 0, | ||
len = str.length; | ||
for (; len >= 4; ++i, len -= 4) { | ||
k = | ||
(str.charCodeAt(i) & 0xff) | | ||
((str.charCodeAt(++i) & 0xff) << 8) | | ||
((str.charCodeAt(++i) & 0xff) << 16) | | ||
((str.charCodeAt(++i) & 0xff) << 24); | ||
|
||
k = | ||
/* Math.imul(k, m): */ | ||
(k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16); | ||
k ^= /* k >>> r: */ k >>> 24; | ||
|
||
h = | ||
/* Math.imul(k, m): */ | ||
((k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16)) ^ | ||
/* Math.imul(h, m): */ | ||
((h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16)); | ||
} | ||
|
||
// Handle the last few bytes of the input array | ||
|
||
switch (len) { | ||
case 3: | ||
h ^= (str.charCodeAt(i + 2) & 0xff) << 16; | ||
case 2: | ||
h ^= (str.charCodeAt(i + 1) & 0xff) << 8; | ||
case 1: | ||
h ^= str.charCodeAt(i) & 0xff; | ||
h = | ||
/* Math.imul(h, m): */ | ||
(h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16); | ||
} | ||
|
||
// Do a few final mixes of the hash to ensure the last few | ||
// bytes are well-incorporated. | ||
|
||
h ^= h >>> 13; | ||
h = | ||
/* Math.imul(h, m): */ | ||
(h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16); | ||
|
||
return ((h ^ (h >>> 15)) >>> 0).toString(36); | ||
} | ||
|
||
// Copied from https://github.com/styled-components/styled-components/blob/master/packages/styled-components/src/utils/hash.js | ||
|
||
const SEED = 5381; | ||
|
||
// When we have separate strings it's useful to run a progressive | ||
// version of djb2 where we pretend that we're still looping over | ||
// the same string | ||
const phash = (h, x) => { | ||
let i = x.length; | ||
|
||
while (i) { | ||
h = (h * 33) ^ x.charCodeAt(--i); | ||
} | ||
|
||
return h; | ||
}; | ||
|
||
// This is a djb2 hashing function | ||
const hash = (x) => { | ||
return phash(SEED, x); | ||
}; | ||
|
||
// switch between readable vs faster & smaller classnames depending on environment | ||
const readableHash = (value) => CSS.escape(value).replace(/\\./g, '_') | ||
|
||
export default murmur2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters