{"id":12158,"date":"2025-01-31T13:29:50","date_gmt":"2025-01-31T13:29:50","guid":{"rendered":"https:\/\/metaschool.so\/articles\/?p=12158"},"modified":"2025-02-02T13:31:16","modified_gmt":"2025-02-02T13:31:16","slug":"understanding-hash-functions-in-web3","status":"publish","type":"post","link":"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/","title":{"rendered":"Understanding Hash Functions in Web3: A Comprehensive Guide"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_56_1 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title \" >Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Introduction_to_Hash_Functions\" title=\"Introduction to Hash Functions\">Introduction to Hash Functions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Hash_Functions_in_the_Web3_Ecosystem\" title=\"Hash Functions in the Web3 Ecosystem\">Hash Functions in the Web3 Ecosystem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Common_Hash_Functions_in_Web3\" title=\"Common Hash Functions in Web3\">Common Hash Functions in Web3<\/a><ul class='ez-toc-list-level-3'><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#SHA-256_Secure_Hash_Algorithm_256-bit\" title=\"SHA-256 (Secure Hash Algorithm 256-bit) \">SHA-256 (Secure Hash Algorithm 256-bit) <\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Keccak-256_Ethereums_Hash_Function\" title=\"Keccak-256 (Ethereum&#8217;s Hash Function)\">Keccak-256 (Ethereum&#8217;s Hash Function)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#RIPEMD-160\" title=\"RIPEMD-160\">RIPEMD-160<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Implementation_Examples\" title=\"Implementation Examples\">Implementation Examples<\/a><ul class='ez-toc-list-level-4'><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Implementation_of_SHA-256\" title=\"Implementation of SHA-256 \">Implementation of SHA-256 <\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Keccak-256_Implementation_Example\" title=\"Keccak-256 Implementation Example\">Keccak-256 Implementation Example<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#RIPEMD-160_Implementation_Example\" title=\"RIPEMD-160 Implementation Example\">RIPEMD-160 Implementation Example<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Hashing_in_Blockchain_Protocols\" title=\"Hashing in Blockchain Protocols\">Hashing in Blockchain Protocols<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Smart_Contracts_and_Hash_Functions\" title=\"Smart Contracts and Hash Functions \">Smart Contracts and Hash Functions <\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Security_Considerations_and_Challenges\" title=\"Security Considerations and Challenges\">Security Considerations and Challenges<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Use_Cases_and_Real-world_Applications\" title=\"Use Cases and Real-world Applications\">Use Cases and Real-world Applications<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Future_of_Hashing_in_Web3\" title=\"Future of Hashing in Web3\">Future of Hashing in Web3<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/metaschool.so\/articles\/understanding-hash-functions-in-web3\/#Conclusion\" title=\"Conclusion\">Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n\n<p>Hash functions form the\u00a0very\u00a0basis\u00a0of modern cryptography and are\u00a0core\u00a0to the architecture of Web3 technologies. This technical\u00a0deep\u00a0dive\u00a0will\u00a0explain\u00a0the\u00a0intricacies\u00a0of hash functions, their implementation in Web3, and their crucial role in shaping the future of decentralized systems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Introduction_to_Hash_Functions\"><\/span>Introduction to Hash Functions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A\u00a0hash\u00a0function,\u00a0on\u00a0the\u00a0other\u00a0hand, is fundamentally a\u00a0mathematical\u00a0algorithm\u00a0that\u00a0transforms\u00a0an\u00a0arbitrary-sized\u00a0input\u00a0into\u00a0a\u00a0fixed-size output. The deterministic nature of hash functions ensures that identical inputs always produce identical outputs, while their collision resistance makes it computationally infeasible to find two different inputs that generate the same hash value.<\/p>\n\n\n\n<p>One-way\u00a0cryptographic hash functions\u00a0mean\u00a0that\u00a0the\u00a0computation\u00a0of\u00a0a\u00a0hash value from input data\u00a0is\u00a0computationally\u00a0easy,\u00a0while\u00a0deriving\u00a0the original input from the hash value alone\u00a0is computationally infeasible. This property\u00a0is\u00a0called\u00a0pre-image resistance\u00a0and\u00a0is\u00a0one\u00a0of\u00a0the main factors\u00a0securing sensitive information and maintaining the integrity of blockchain networks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Hash_Functions_in_the_Web3_Ecosystem\"><\/span>Hash Functions in the Web3 Ecosystem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Hash functions\u00a0are\u00a0foundational\u00a0in\u00a0almost\u00a0any\u00a0cryptographic\u00a0operation\u00a0or\u00a0mechanism\u00a0that\u00a0occurs\u00a0in\u00a0the\u00a0scope\u00a0of\u00a0Web3.\u00a0Starting\u00a0with\u00a0the\u00a0generation\u00a0of\u00a0unique identifiers\u00a0either\u00a0for\u00a0a\u00a0transaction\u00a0or\u00a0blocks\u00a0to\u00a0securing the\u00a0very\u00a0integrity of\u00a0an entire\u00a0blockchain\u00a0network\u00a0through\u00a0digital\u00a0signatures,\u00a0the\u00a0role\u00a0of\u00a0robust cryptographic primitives\u00a0independent\u00a0from\u00a0central authority oversight\u00a0is\u00a0something with which\u00a0hash functions\u00a0comfortably\u00a0fit\u00a0most\u00a0such\u00a0security-critical operations\u00a0within\u00a0this class of highly\u00a0decentralized applications.<\/p>\n\n\n\n<p>In\u00a0dApps, hash functions\u00a0are\u00a0in wide usage, allowing for\u00a0secure user authentication,\u00a0verification of\u00a0data, and\u00a0processing\u00a0of transactions. They&#8217;re particularly crucial in maintaining the immutability of blockchain records and ensuring the consistency of distributed ledger states across network nodes. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Common_Hash_Functions_in_Web3\"><\/span>Common Hash Functions in Web3<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A\u00a0few\u00a0hash functions have\u00a0become\u00a0standards in the Web3 ecosystem, each\u00a0rooted\u00a0in\u00a0different\u00a0mathematics\u00a0and\u00a0providing different\u00a0security properties. Let&#8217;s examine\u00a0how\u00a0some\u00a0of these\u00a0key\u00a0algorithms\u00a0work on the inside.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"SHA-256_Secure_Hash_Algorithm_256-bit\"><\/span>SHA-256 (Secure Hash Algorithm 256-bit) <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>SHA-256\u00a0falls\u00a0under\u00a0the SHA-2 family\u00a0and\u00a0runs on\u00a0messages\u00a0in\u00a0serial\u00a0mode.\u00a0It\u00a0uses\u00a0very complicated\u00a0mathematical operations. The\u00a0procedure of the\u00a0algorithm\u00a0involves\u00a0the\u00a0following\u00a0major\u00a0steps:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"305\" src=\"https:\/\/metaschool.so\/articles\/wp-content\/uploads\/2025\/01\/image-14.png\" alt=\"SHA 256 hash functions\n\n\" class=\"wp-image-12187\" srcset=\"https:\/\/metaschool.so\/articles\/wp-content\/uploads\/2025\/01\/image-14.png 850w, https:\/\/metaschool.so\/articles\/wp-content\/uploads\/2025\/01\/image-14-300x108.png 300w, https:\/\/metaschool.so\/articles\/wp-content\/uploads\/2025\/01\/image-14-768x276.png 768w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Message Padding: <\/strong>The input message M is padded to ensure its length is a multiple of 512 bits<strong>. <\/strong>This involves:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Append a single &#8216;1&#8217; bit<\/li>\n\n\n\n<li>Add k &#8216;0&#8217; bits, where k is the smallest non-negative solution to: l + 1 + k \u2261 448 mod 512<\/li>\n\n\n\n<li>Append the original message length l as a 64-bit big-endian integer<\/li>\n<\/ul>\n\n\n\n<p>2. <strong>Message Schedule Creation: <\/strong>The padded message is divided into 512-bit blocks (M\u2081, M\u2082, \u2026, M\u2099). For each block:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Split into 16 32-bit words (W\u2080, W\u2081, \u2026, W\u2081\u2085)<\/li>\n\n\n\n<li>Extend to 64 words using the formula:<br>W\u1d62 = \u03c3\u2081(W\u1d62\u208b\u2082) + W\u1d62\u208b\u2087 + \u03c3\u2080(W\u1d62\u208b\u2081\u2085) + W\u1d62\u208b\u2081\u2086<br>where \u03c3\u2080(x) = ROTR\u2077(x) \u2295 ROTR\u00b9\u2078(x) \u2295 SHR\u00b3(x)<br>and \u03c3\u2081(x) = ROTR\u00b9\u2077(x) \u2295 ROTR\u00b9\u2079(x) \u2295 SHR\u00b9\u2070(x)<\/li>\n<\/ul>\n\n\n\n<p>3. <strong>Compression Function:<\/strong> It Uses eight working variables (a, b, c, d, e, f, g, h) initialized with the first 32 bits of the fractional parts of the square roots of the first 8 primes. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>The main compression loop: For i from 0 to 63:\nT\u2081 = h + \u03a3\u2081(e) + Ch(e,f,g) + K\u1d62 + W\u1d62\nT\u2082 = \u03a3\u2080(a) + Maj(a,b,c)\nh = g\ng = f\nf = e\ne = d + T\u2081\nd = c\nc = b\nb = a\na = T\u2081 + T\u2082 where:\n\u03a3\u2080(x) = ROTR\u00b2(x) \u2295 ROTR\u00b9\u00b3(x) \u2295 ROTR\u00b2\u00b2(x)\n\u03a3\u2081(x) = ROTR\u2076(x) \u2295 ROTR\u00b9\u00b9(x) \u2295 ROTR\u00b2\u2075(x)\nCh(x,y,z) = (x \u2227 y) \u2295 (\u00acx \u2227 z)\nMaj(x,y,z) = (x \u2227 y) \u2295 (x \u2227 z) \u2295 (y \u2227 z)<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Keccak-256_Ethereums_Hash_Function\"><\/span>Keccak-256 (Ethereum&#8217;s Hash Function)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Keccak-256, used in Ethereum, follows quite a different approach than the traditional one called the sponge construction. Its mathematical structure consists of:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>State Array:<\/strong> A 5\u00d75\u00d764 state array of bits, adding up to a total of 1600 bits<\/li>\n\n\n\n<li><strong>Round Function f:<\/strong><br><br>Composed of five steps (\u03b8, \u03c1, \u03c0, \u03c7, \u03b9): \u03b8 step: C[x] = A[x,0] \u2295 A[x,1] \u2295 A[x,2] \u2295 A[x,3] \u2295 A[x,4]<br>D[x] = C[x-1] \u2295 ROT(C[x+1], 1)<br>A[x,y] = A[x,y] \u2295 D[x] \u03c1 and \u03c0 steps: B[y,2x+3y] = ROT(A[x,y], r[x,y]) \u03c7 step: A[x,y] = B[x,y] \u2295 ((\u00acB[x+1,y]) \u2227 B[x+2,y]) \u03b9 step: A[0,0] = A[0,0] \u2295 RC<\/li>\n<\/ol>\n\n\n\n<p>where RC is a round constant and ROT represents bitwise rotation.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Absorption Phase:<\/strong> The input message is padded and divided into r-bit blocks (r=1088 for Keccak-256), which are XORed into the first r bits of the state<\/li>\n\n\n\n<li><strong>Squeezing Phase:<\/strong> The first r bits of the state are output, and the state is permuted using f between each output block until the desired output length is reached<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RIPEMD-160\"><\/span>RIPEMD-160<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>RIPEMD-160 uses a dual-stream compression function with parallel computations:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Message Block Processing:<\/strong><br>For each 512-bit message block M\u1d62:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Split into 16 32-bit words x\u2080, x\u2081, \u2026, x\u2081\u2085<\/li>\n\n\n\n<li>Process through two parallel lines (left and right)<\/li>\n\n\n\n<li>Each line performs 80 steps using different constants and functions<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Compression Function:<\/strong><br>h(H,M) = H + (h'(H,M) \u226b s) + (h&#8221;(H,M) \u226b s&#8217;)<br>where h&#8217; and h&#8221; are the left and right line outputs<br>and s, s&#8217; are fixed rotations<\/li>\n\n\n\n<li><strong>Step Function:<\/strong><br>A = (A + f(j,B,C,D) + X\u1d62 + K(j)) \u226a s<br>where f(j,X,Y,Z) varies for different step ranges:<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<ul class=\"wp-block-list\">\n<li>Steps 0-15: f(X,Y,Z) = X \u2295 Y \u2295 Z<\/li>\n\n\n\n<li>Steps 16-31: f(X,Y,Z) = (X \u2227 Y) \u2228 (\u00acX \u2227 Z)<\/li>\n\n\n\n<li>Steps 32-47: f(X,Y,Z) = (X \u2228 \u00acY) \u2295 Z<\/li>\n\n\n\n<li>Steps 48-63: f(X,Y,Z) = (X \u2227 Z) \u2228 (Y \u2227 \u00acZ)<\/li>\n\n\n\n<li>Steps 64-79: f(X,Y,Z) = X \u2295 (Y \u2228 \u00acZ)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<p>The\u00a0combined\u00a0usage\u00a0of\u00a0all of\u00a0these hash functions\u00a0within\u00a0Web3 protocols demonstrates\u00a0a\u00a0proper\u00a0choice\u00a0based on\u00a0the\u00a0needed\u00a0security\u00a0and\/or\u00a0performance constraints. For example, Bitcoin\u00a0uses\u00a0SHA-256\u00a0combined\u00a0with\u00a0RIPEMD-160\u00a0to generate the addresses\u00a0in its\u00a0protocol,\u00a0aiming\u00a0to\u00a0balance\u00a0both\u00a0security and efficiency, while Ethereum\u00a0chose\u00a0Keccak-256\u00a0since\u00a0it\u00a0could\u00a0efficiently be implemented\u00a0in smart contracts,\u00a0featuring\u00a0resistance\u00a0to\u00a0length extension attacks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementation_Examples\"><\/span>Implementation Examples<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Let&#8217;s examine practical implementations of these hash functions:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementation_of_SHA-256\"><\/span>Implementation of SHA-256 <span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class SHA256 {\n    constructor() {\n        this.h = new Uint32Array([\n            0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n            0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n        ]);\n        this.k = new Uint32Array([\n            0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n            \/\/ ... (remaining constants)\n        ]);\n    }\n\n    \/\/ Right rotate function\n    rotr(n, x) {\n        return (x &gt;&gt;&gt; n) | (x << (32 - n));\n    }\n\n    \/\/ SHA-256 functions\n    Ch(x, y, z) { return (x &amp; y) ^ (~x &amp; z); }\n    Maj(x, y, z) { return (x &amp; y) ^ (x &amp; z) ^ (y &amp; z); }\n    \u03a30(x) { return this.rotr(2, x) ^ this.rotr(13, x) ^ this.rotr(22, x); }\n    \u03a31(x) { return this.rotr(6, x) ^ this.rotr(11, x) ^ this.rotr(25, x); }\n    \u03c30(x) { return this.rotr(7, x) ^ this.rotr(18, x) ^ (x &gt;&gt;&gt; 3); }\n    \u03c31(x) { return this.rotr(17, x) ^ this.rotr(19, x) ^ (x &gt;&gt;&gt; 10); }\n\n    \/\/ Process a 512-bit block\n    processBlock(M) {\n        const W = new Uint32Array(64);\n        \/\/ Message schedule\n        for (let t = 0; t < 16; t++) {\n            W[t] = M[t];\n        }\n        for (let t = 16; t < 64; t++) {\n            W[t] = this.\u03c31(W[t-2]) + W[t-7] + this.\u03c30(W[t-15]) + W[t-16];\n        }\n\n        \/\/ Working variables\n        let [a, b, c, d, e, f, g, h] = this.h;\n\n        \/\/ Main loop\n        for (let t = 0; t < 64; t++) {\n            const T1 = h + this.\u03a31(e) + this.Ch(e, f, g) + this.k[t] + W[t];\n            const T2 = this.\u03a30(a) + this.Maj(a, b, c);\n            [h, g, f, e, d, c, b, a] = [g, f, e, d + T1, c, b, a, T1 + T2];\n        }\n\n        \/\/ Update hash values\n        this.h = this.h.map((x, i) =&gt; x + [a, b, c, d, e, f, g, h][i]);\n    }\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SHA256<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">constructor<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Uint32Array<\/span><span style=\"color: #D4D4D4\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #B5CEA8\">0x6a09e667<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xbb67ae85<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x3c6ef372<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xa54ff53a<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #B5CEA8\">0x510e527f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x9b05688c<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x1f83d9ab<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x5be0cd19<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        ]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Uint32Array<\/span><span style=\"color: #D4D4D4\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #B5CEA8\">0x428a2f98<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x71374491<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xb5c0fbcf<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xe9b5dba5<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ ... (remaining constants)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        ]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Right rotate function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">n<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &gt;&gt;&gt; <\/span><span style=\"color: #9CDCFE\">n<\/span><span style=\"color: #D4D4D4\">) | (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt;&lt; (<\/span><span style=\"color: #B5CEA8\">32<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">n<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ SHA-256 functions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">Ch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) ^ (~<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">Maj<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) ^ (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) ^ (<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">\u03a30<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">22<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">\u03a31<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">25<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">\u03c30<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &gt;&gt;&gt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">\u03c31<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">17<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotr<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">) ^ (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &gt;&gt;&gt; <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Process a 512-bit block<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">processBlock<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">M<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Uint32Array<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">64<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Message schedule<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #4FC1FF\">M<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">64<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">\u03c31<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">]) + <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">\u03c30<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">15<\/span><span style=\"color: #D4D4D4\">]) + <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Working variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Main loop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">64<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T1<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">\u03a31<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">g<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #4FC1FF\">W<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T2<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">\u03a30<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Maj<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">] = [<\/span><span style=\"color: #9CDCFE\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #4FC1FF\">T1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">T1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #4FC1FF\">T2<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Update hash values<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">map<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + [<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">f<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">][<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Keccak-256_Implementation_Example\"><\/span>Keccak-256 Implementation Example<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class Keccak {\n    constructor() {\n        this.state = new Uint8Array(200); \/\/ 1600 bits\n        this.rate = 1088 \/ 8; \/\/ Rate in bytes\n    }\n\n    \/\/ Keccak-f[1600] permutation\n    keccakF() {\n        const rounds = 24;\n        const rotationConstants = [\n            [0, 1, 62, 28, 27],\n            [36, 44, 6, 55, 20],\n            [3, 10, 43, 25, 39],\n            [41, 45, 15, 21, 8],\n            [18, 2, 61, 56, 14]\n        ];\n\n        for (let round = 0; round < rounds; round++) {\n            \/\/ \u03b8 step\n            const C = new Array(5);\n            const D = new Array(5);\n\n            for (let x = 0; x < 5; x++) {\n                C[x] = this.state[x] ^ this.state[x + 5] ^ \n                       this.state[x + 10] ^ this.state[x + 15] ^ \n                       this.state[x + 20];\n            }\n\n            for (let x = 0; x < 5; x++) {\n                D[x] = C[(x + 4) % 5] ^ this.rotateLeft(C[(x + 1) % 5], 1);\n                for (let y = 0; y < 5; y++) {\n                    this.state[x + 5 * y] ^= D[x];\n                }\n            }\n\n            \/\/ \u03c1 and \u03c0 steps combined\n            let current = this.state[1];\n            for (let x = 0; x < 5; x++) {\n                for (let y = 0; y < 5; y++) {\n                    const newX = y;\n                    const newY = (2 * x + 3 * y) % 5;\n                    const offset = rotationConstants[x][y];\n                    const temp = this.state[newX + 5 * newY];\n                    this.state[newX + 5 * newY] = this.rotateLeft(current, offset);\n                    current = temp;\n                }\n            }\n\n            \/\/ \u03c7 step\n            for (let y = 0; y < 5; y++) {\n                const T = new Array(5);\n                for (let x = 0; x < 5; x++) {\n                    T[x] = this.state[x + 5 * y];\n                }\n                for (let x = 0; x < 5; x++) {\n                    this.state[x + 5 * y] = T[x] ^ \n                        ((~T[(x + 1) % 5]) &amp; T[(x + 2) % 5]);\n                }\n            }\n\n            \/\/ \u03b9 step\n            this.state[0] ^= this.roundConstants[round];\n        }\n    }\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Keccak<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">constructor<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Uint8Array<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">200<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ 1600 bits<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rate<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">1088<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ Rate in bytes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Keccak-f[1600] permutation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">keccakF<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">rounds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">24<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">rotationConstants<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">62<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">28<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">27<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #B5CEA8\">36<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">44<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">55<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">43<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">25<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">39<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #B5CEA8\">41<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">45<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">15<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">61<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">56<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">14<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">round<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">round<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">rounds<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">round<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ \u03b8 step<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">C<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Array<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">D<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Array<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #4FC1FF\">C<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                       <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">15<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                       <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #4FC1FF\">D<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #4FC1FF\">C<\/span><span style=\"color: #D4D4D4\">[(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">) % <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">C<\/span><span style=\"color: #D4D4D4\">[(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) % <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">], <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">] ^= <\/span><span style=\"color: #4FC1FF\">D<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ \u03c1 and \u03c0 steps combined<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">current<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">newX<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">newY<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) % <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">offset<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">rotationConstants<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">][<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">temp<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">newX<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">newY<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">newX<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">newY<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">current<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">offset<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #9CDCFE\">current<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">temp<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ \u03c7 step<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Array<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">] ^ <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        ((~<\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">[(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) % <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">]) &amp; <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">[(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) % <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ \u03b9 step<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] ^= <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">roundConstants<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">round<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RIPEMD-160_Implementation_Example\"><\/span>RIPEMD-160 Implementation Example<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class RIPEMD160 {\n    constructor() {\n        this.h = new Uint32Array([\n            0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0\n        ]);\n    }\n\n    \/\/ The five basic functions\n    f1(x, y, z) { return x ^ y ^ z; }\n    f2(x, y, z) { return (x &amp; y) | (~x &amp; z); }\n    f3(x, y, z) { return (x | ~y) ^ z; }\n    f4(x, y, z) { return (x &amp; z) | (y &amp; ~z); }\n    f5(x, y, z) { return x ^ (y | ~z); }\n\n    \/\/ Process a block\n    processBlock(block) {\n        let [a1, b1, c1, d1, e1] = this.h;\n        let [a2, b2, c2, d2, e2] = this.h;\n\n        \/\/ Left line\n        for (let j = 0; j < 80; j++) {\n            let T = this.rotateLeft(\n                a1 + this.f(j, b1, c1, d1) + block[this.r1[j]] + this.K1(j),\n                this.s1[j]\n            ) + e1;\n            [a1, b1, c1, d1, e1] = [e1, T, b1, this.rotateLeft(c1, 10), d1];\n        }\n\n        \/\/ Right line\n        for (let j = 0; j < 80; j++) {\n            let T = this.rotateLeft(\n                a2 + this.f(79-j, b2, c2, d2) + block[this.r2[j]] + this.K2(j),\n                this.s2[j]\n            ) + e2;\n            [a2, b2, c2, d2, e2] = [e2, T, b2, this.rotateLeft(c2, 10), d2];\n        }\n\n        \/\/ Combine results\n        let T = this.h[1] + c1 + d2;\n        this.h[1] = this.h[2] + d1 + e2;\n        this.h[2] = this.h[3] + e1 + a2;\n        this.h[3] = this.h[4] + a1 + b2;\n        this.h[4] = this.h[0] + b1 + c2;\n        this.h[0] = T;\n    }\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">RIPEMD160<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">constructor<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Uint32Array<\/span><span style=\"color: #D4D4D4\">([<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #B5CEA8\">0x67452301<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xefcdab89<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x98badcfe<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0x10325476<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xc3d2e1f0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        ]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ The five basic functions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">f1<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> ^ <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> ^ <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">f2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) | (~<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">f3<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> | ~<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">) ^ <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">f4<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) | (<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> &amp; ~<\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">f5<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">) { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\"> ^ (<\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\"> | ~<\/span><span style=\"color: #9CDCFE\">z<\/span><span style=\"color: #D4D4D4\">); }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Process a block<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">processBlock<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">block<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #9CDCFE\">a1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e1<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #9CDCFE\">a2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e2<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Left line<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">80<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">a1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">f<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d1<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #9CDCFE\">block<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">r1<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">]] + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">K1<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">s1<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ) + <\/span><span style=\"color: #9CDCFE\">e1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #9CDCFE\">a1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e1<\/span><span style=\"color: #D4D4D4\">] = [<\/span><span style=\"color: #9CDCFE\">e1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #9CDCFE\">d1<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Right line<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">80<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">a2<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">f<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">79<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d2<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #9CDCFE\">block<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">r2<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">]] + <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">K2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">s2<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ) + <\/span><span style=\"color: #9CDCFE\">e2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            [<\/span><span style=\"color: #9CDCFE\">a2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">c2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">d2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">e2<\/span><span style=\"color: #D4D4D4\">] = [<\/span><span style=\"color: #9CDCFE\">e2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">b2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">rotateLeft<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #9CDCFE\">d2<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Combine results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #9CDCFE\">c1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">d2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #9CDCFE\">d1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">e2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #9CDCFE\">e1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">a2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #9CDCFE\">a1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">b2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] + <\/span><span style=\"color: #9CDCFE\">b1<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">c2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #4FC1FF\">T<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The\u00a0following\u00a0implementations\u00a0below\u00a0outline\u00a0the internal\u00a0details\u00a0of each hash function,\u00a0but\u00a0in\u00a0a real-world application, it\u00a0is\u00a0always advisable\u00a0to use well-tested\u00a0cryptography\u00a0libraries\u00a0instead\u00a0of\u00a0any\u00a0self-made implementation of\u00a0these functions.\u00a0Below\u00a0code\u00a0snippets\u00a0just\u00a0illustrate\u00a0the\u00a0above-mentioned\u00a0mathematical operations and transformations\u00a0and\u00a0provide\u00a0a\u00a0more\u00a0concrete\u00a0reference for\u00a0how these algorithms work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Hashing_in_Blockchain_Protocols\"><\/span>Hashing in Blockchain Protocols<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Hashing\u00a0plays\u00a0a\u00a0much\u00a0greater role\u00a0in blockchain protocols\u00a0than\u00a0providing\u00a0basic\u00a0integrity. In proof-of-work consensus\u00a0algorithms, miners\u00a0have\u00a0to\u00a0find a nonce\u00a0such\u00a0that,\u00a0combined with block data,\u00a0the\u00a0hash value\u00a0of\u00a0this\u00a0combination\u00a0meets\u00a0certain\u00a0criteria, usually\u00a0a certain number of\u00a0starting\u00a0zero bits. This computational challenge\u00a0provides\u00a0security\u00a0for\u00a0the network,\u00a0as\u00a0through\u00a0this\u00a0approach\u00a0the\u00a0resource\u00a0costs\u00a0associated\u00a0with\u00a0creating\u00a0blocks\u00a0become\u00a0prohibitively\u00a0costly.<\/p>\n\n\n\n<p>Hash functions\u00a0play a significant role in digital signatures within blockchain transactions.\u00a0While\u00a0creating a transaction,\u00a0it\u00a0is\u00a0the\u00a0hash of the transaction data\u00a0that\u00a0gets\u00a0signed by\u00a0the\u00a0sender&#8217;s private key, not the\u00a0complete transaction. This\u00a0ensures data integrity\u00a0while\u00a0reducing\u00a0computational overhead\u00a0during\u00a0signature operations.<\/p>\n\n\n\n<p>Merkle trees, fundameMerkle trees\u00a0are\u00a0a\u00a0common component of\u00a0blockchain architectures.\u00a0They\u00a0implement\u00a0hash functions\u00a0with\u00a0the\u00a0key property of providing\u00a0efficient proofs of\u00a0inclusion of\u00a0data.\u00a0In\u00a0a Merkle tree, every\u00a0non-leaf node\u00a0contains\u00a0a\u00a0hash\u00a0of\u00a0the\u00a0concatenated\u00a0values\u00a0of its child nodes,\u00a0converging\u00a0into\u00a0a single root hash that\u00a0summarizes\u00a0a\u00a0set of transactions in a block.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Smart_Contracts_and_Hash_Functions\"><\/span>Smart Contracts and Hash Functions <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Smart contracts leverage hash functions in numerous ways to ensure secure and verifiable execution of programmatic agreements. Random number generation in smart contracts often involves combining multiple sources of entropy with hash functions to create unpredictable yet verifiable results. This approach is crucial for applications like gambling dApps or random prize distributions.<\/p>\n\n\n\n<p>Cryptographic commitments in smart contracts frequently use hash functions to allow parties to commit to a value without revealing it immediately. For example, in a blockchain-based voting system, voters might first submit the hash of their vote, later revealing the actual vote during the counting phase. The hash commitment ensures votes cannot be changed while maintaining privacy during the voting period.<\/p>\n\n\n\n<p>Zero-knowledge proofs, increasingly important in privacy-preserving smart contracts, rely heavily on hash functions for creating succinct proofs of computation. These proofs allow one party to prove they know certain information without revealing the information itself, a capability essential for maintaining privacy in transparent blockchain systems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Security_Considerations_and_Challenges\"><\/span>Security Considerations and Challenges<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>While hash functions provide robust security guarantees, their implementation in Web3 systems presents unique challenges. Hash collision attacks, though theoretically possible, become practically infeasible with properly chosen hash functions and output sizes. However, the increasing power of quantum computers poses a potential threat to current hash function security, particularly regarding collision resistance.<\/p>\n\n\n\n<p>Pre-image attacks, where an attacker attempts to find an input that produces a specific hash value, remain a concern for certain applications. Smart contract developers must be particularly careful when using hash functions for random number generation or commitment schemes, as predictable inputs could lead to exploitable patterns.<\/p>\n\n\n\n<p>To mitigate these risks, Web3 protocols often implement additional security measures alongside hash functions. These might include using multiple hash functions in combination, adding salt values to inputs, or implementing time-delay mechanisms to prevent certain types of attacks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Use_Cases_and_Real-world_Applications\"><\/span>Use Cases and Real-world Applications<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The practical applications of hash functions in Web3 extend across numerous projects and platforms. Bitcoin&#8217;s use of double SHA-256 hashing in its proof-of-work system has demonstrated the resilience of well-implemented hash functions at scale. Ethereum&#8217;s account model relies on Keccak-256 for address generation and transaction verification, processing millions of operations daily.<\/p>\n\n\n\n<p>InterPlanetary File System (IPFS) uses content-based addressing through hash functions to create unique identifiers for stored files. This approach enables efficient content distribution and verification across decentralized networks. Similarly, Git version control systems use SHA-1 (though transitioning to SHA-256) for commit identification and integrity verification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Future_of_Hashing_in_Web3\"><\/span>Future of Hashing in Web3<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The evolution of Web3 technologies continues to push the boundaries of hash function applications. Emerging consensus mechanisms like proof-of-stake still rely on hash functions for block production and validation, though in different ways than traditional proof-of-work systems. Privacy-focused protocols are exploring novel applications of hash functions in zero-knowledge proofs and other privacy-preserving mechanisms.<\/p>\n\n\n\n<p>The potential impact of quantum computing has sparked research into quantum-resistant hash functions and hybrid cryptographic systems. These developments suggest that while the fundamental importance of hash functions in Web3 will persist, their implementation and usage patterns may evolve significantly.<\/p>\n\n\n\n<p>As Web3 continues to mature, we can expect to see new applications of hash functions in areas like decentralized identity systems, cross-chain bridges, and layer-2 scaling solutions. The challenge will be maintaining security and efficiency while adapting to emerging threats and technological advances.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Hash functions remain central to the security and functionality of Web3 systems, from basic transaction verification to complex privacy-preserving protocols. Understanding their properties, implementations, and limitations is crucial for developers and architects working in the Web3 space. As the ecosystem evolves, hash functions will continue to adapt and find new applications in securing and enabling decentralized systems. If you are interested to know more about the<a href=\"https:\/\/learning.quantum.ibm.com\/course\/practical-introduction-to-quantum-safe-cryptography\/cryptographic-hash-functions\" data-type=\"link\" data-id=\"https:\/\/learning.quantum.ibm.com\/course\/practical-introduction-to-quantum-safe-cryptography\/cryptographic-hash-functions\" target=\"_blank\" rel=\"noopener\"> Cryptographic Hash Functions<\/a> you can learn it through this detailed course by IBM.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":24,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[17],"tags":[],"class_list":["post-12158","post","type-post","status-publish","format-standard","hentry","category-blockchain"],"_links":{"self":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/12158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/comments?post=12158"}],"version-history":[{"count":5,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/12158\/revisions"}],"predecessor-version":[{"id":12190,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/12158\/revisions\/12190"}],"wp:attachment":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/media?parent=12158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/categories?post=12158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/tags?post=12158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}