Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

meow_hash_cpp

Build Status

This is a rewrite of the Casey's Muratori Meow hash (https://github.com/cmuratori/meow_hash), utilizing modern C++ features to significantly tidy up the codebase and get rid of a large amount of undefined behaviour present in the original implementation.

Compatibility

CompilerMin. Version
MSVC (Visual Studio)19.1 (VS 2017.3 P2)
clang3.9
gcc7
EDG eccp4.14

Example Usage

// standalone hash 
std::array<int, 4> input {322, 2137, 42069, 65536};
meowh::hash_t<32> hash = meowh::meow_hash<128, 32>(input); // extracting parts of the 512 bit long hash resultunsignedint hash_32 = hash[0];
unsignedlonglong hash_64 = hash.as<64>(0);
__m128i l0 = hash.as<128>(0);
__m128i l1 = hash.as<128>(1);
__m128i l2 = hash.as<128>(2);
__m128i l3 = hash.as<128>(3);
// converting hash result to use a different element type
meowh::hash_t<256> hash256 = hash;
__m256i h0 = hash256[0];
__m256i h1 = hash256[1];

Usage Instructions

The template arguments of the meowh::meow_hash function specify the following:

  • The first argument, N, specifies the version of the hashing algorithm to use. 128 uses MeowHash1, 256 uses MeowHash2, and 512 uses MeowHash4. Nothing else will need to be changed to switch between the different versions when MeowHash2 and MeowHash4 become publically usible.
  • The second argument, Align, specifies whether the input buffer fed to the function is asssumed to be aligned to 16, 32, or 64 bytes, depending on whether MeowHash1, 2, or 4 is being used. If so, an optimization will be enabled in the algorithm. Note that setting Align to true without the input buffer not being actually aligned is undefined behaviour (unaligned read).
  • The second argument, R, specifies the element type the returned 512 bit hash will use. It is set to the same value as N by default.

Due to undefined behavior problems involving switching between unions, the original hash return type, meow_lane, has been replaced by meowh::hash_t. hash_t has a single template argument, which determines the size in bits of the elements of the internal 512 bit long array to hold the hash result. 32, 64, 128, 256 and 512 are valid values. 128, 256 and 512 are only allowed if the target machine supports SSE, AVX, and AVX512F, respectively. Alternatively, if the user wants to manually enable them without relying on feature test macros, macros _MEOWH_128, _MEOWH_256 and _MEOWH_512 should be defined before including meow_hash.cpp. These elements can be accessed by indexing the hash_t object with the array subscript operator ([]). Values of other types than the element type can be obtained with the use of the .as member function. It takes a single template argument, specifying the size in bits of the desired type, and a single function argument, specifying the desired array member of the internal 512 bit long array expressed as an array of the desired type.

meowh::meow_hash provides several convenient overloads, all accepting an optional seed argument:

  • C-style const void* + size_t pair
  • const std::vector<T>&
  • const std::basic_string<T>&
  • A pair of templated iterators
  • const std::array<T, N>&
  • const std::initializer_list<T>&

Build Instructions

The library is provided as a single standalone header, for static linking only. No build instructions are nessessary.

About

A cleaner rewrite of the meow hash by Casey Muratori, utilizing modern C++ features

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages