| <!DOCTYPE HTML> |
| <html lang="en"> |
| <head> |
| <!-- Generated by javadoc (17) --> |
| <title>Source code</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content="source: package: org.apache.hadoop.hbase.util, class: JenkinsHash"> |
| <meta name="generator" content="javadoc/SourceToHTMLConverter"> |
| <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style"> |
| </head> |
| <body class="source-page"> |
| <main role="main"> |
| <div class="source-container"> |
| <pre><span class="source-line-no">001</span><span id="line-1">/*</span> |
| <span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span> |
| <span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span> |
| <span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span> |
| <span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span> |
| <span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span> |
| <span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span> |
| <span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span> |
| <span class="source-line-no">009</span><span id="line-9"> *</span> |
| <span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="source-line-no">011</span><span id="line-11"> *</span> |
| <span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span> |
| <span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span> |
| <span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span> |
| <span class="source-line-no">017</span><span id="line-17"> */</span> |
| <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.util;</span> |
| <span class="source-line-no">019</span><span id="line-19"></span> |
| <span class="source-line-no">020</span><span id="line-20">import static java.lang.Integer.rotateLeft;</span> |
| <span class="source-line-no">021</span><span id="line-21"></span> |
| <span class="source-line-no">022</span><span id="line-22">import java.io.FileInputStream;</span> |
| <span class="source-line-no">023</span><span id="line-23">import java.io.IOException;</span> |
| <span class="source-line-no">024</span><span id="line-24">import org.apache.yetus.audience.InterfaceAudience;</span> |
| <span class="source-line-no">025</span><span id="line-25">import org.apache.yetus.audience.InterfaceStability;</span> |
| <span class="source-line-no">026</span><span id="line-26"></span> |
| <span class="source-line-no">027</span><span id="line-27">/**</span> |
| <span class="source-line-no">028</span><span id="line-28"> * Produces 32-bit hash for hash table lookup.</span> |
| <span class="source-line-no">029</span><span id="line-29"> *</span> |
| <span class="source-line-no">030</span><span id="line-30"> * <pre></span> |
| <span class="source-line-no">031</span><span id="line-31"> * lookup3.c, by Bob Jenkins, May 2006, Public Domain.</span> |
| <span class="source-line-no">032</span><span id="line-32"> *</span> |
| <span class="source-line-no">033</span><span id="line-33"> * You can use this free for any purpose. It's in the public domain.</span> |
| <span class="source-line-no">034</span><span id="line-34"> * It has no warranty.</span> |
| <span class="source-line-no">035</span><span id="line-35"> * </pre></span> |
| <span class="source-line-no">036</span><span id="line-36"> *</span> |
| <span class="source-line-no">037</span><span id="line-37"> * @see <a href="http://burtleburtle.net/bob/c/lookup3.c">lookup3.c</a></span> |
| <span class="source-line-no">038</span><span id="line-38"> * @see <a href="http://www.ddj.com/184410284">Hash Functions (and how this function compares to</span> |
| <span class="source-line-no">039</span><span id="line-39"> * others such as CRC, MD?, etc</a></span> |
| <span class="source-line-no">040</span><span id="line-40"> * @see <a href="http://burtleburtle.net/bob/hash/doobs.html">Has update on the Dr. Dobbs</span> |
| <span class="source-line-no">041</span><span id="line-41"> * Article</a></span> |
| <span class="source-line-no">042</span><span id="line-42"> */</span> |
| <span class="source-line-no">043</span><span id="line-43">@InterfaceAudience.Private</span> |
| <span class="source-line-no">044</span><span id="line-44">@InterfaceStability.Stable</span> |
| <span class="source-line-no">045</span><span id="line-45">public class JenkinsHash extends Hash {</span> |
| <span class="source-line-no">046</span><span id="line-46"> private static final int BYTE_MASK = 0xff;</span> |
| <span class="source-line-no">047</span><span id="line-47"></span> |
| <span class="source-line-no">048</span><span id="line-48"> private static JenkinsHash _instance = new JenkinsHash();</span> |
| <span class="source-line-no">049</span><span id="line-49"></span> |
| <span class="source-line-no">050</span><span id="line-50"> public static Hash getInstance() {</span> |
| <span class="source-line-no">051</span><span id="line-51"> return _instance;</span> |
| <span class="source-line-no">052</span><span id="line-52"> }</span> |
| <span class="source-line-no">053</span><span id="line-53"></span> |
| <span class="source-line-no">054</span><span id="line-54"> /**</span> |
| <span class="source-line-no">055</span><span id="line-55"> * Compute the hash of the specified file</span> |
| <span class="source-line-no">056</span><span id="line-56"> * @param args name of file to compute hash of.</span> |
| <span class="source-line-no">057</span><span id="line-57"> * @throws IOException e</span> |
| <span class="source-line-no">058</span><span id="line-58"> */</span> |
| <span class="source-line-no">059</span><span id="line-59"> public static void main(String[] args) throws IOException {</span> |
| <span class="source-line-no">060</span><span id="line-60"> if (args.length != 1) {</span> |
| <span class="source-line-no">061</span><span id="line-61"> System.err.println("Usage: JenkinsHash filename");</span> |
| <span class="source-line-no">062</span><span id="line-62"> System.exit(-1);</span> |
| <span class="source-line-no">063</span><span id="line-63"> }</span> |
| <span class="source-line-no">064</span><span id="line-64"> FileInputStream in = new FileInputStream(args[0]);</span> |
| <span class="source-line-no">065</span><span id="line-65"> byte[] bytes = new byte[512];</span> |
| <span class="source-line-no">066</span><span id="line-66"> int value = 0;</span> |
| <span class="source-line-no">067</span><span id="line-67"> JenkinsHash hash = new JenkinsHash();</span> |
| <span class="source-line-no">068</span><span id="line-68"> try {</span> |
| <span class="source-line-no">069</span><span id="line-69"> for (int length = in.read(bytes); length > 0; length = in.read(bytes)) {</span> |
| <span class="source-line-no">070</span><span id="line-70"> value = hash.hash(new ByteArrayHashKey(bytes, 0, length), value);</span> |
| <span class="source-line-no">071</span><span id="line-71"> }</span> |
| <span class="source-line-no">072</span><span id="line-72"> } finally {</span> |
| <span class="source-line-no">073</span><span id="line-73"> in.close();</span> |
| <span class="source-line-no">074</span><span id="line-74"> }</span> |
| <span class="source-line-no">075</span><span id="line-75"> System.out.println(Math.abs(value));</span> |
| <span class="source-line-no">076</span><span id="line-76"> }</span> |
| <span class="source-line-no">077</span><span id="line-77"></span> |
| <span class="source-line-no">078</span><span id="line-78"> /**</span> |
| <span class="source-line-no">079</span><span id="line-79"> * taken from hashlittle() -- hash a variable-length key into a 32-bit value</span> |
| <span class="source-line-no">080</span><span id="line-80"> * @param hashKey the key to extract the bytes for hash algo</span> |
| <span class="source-line-no">081</span><span id="line-81"> * @param initval can be any integer value</span> |
| <span class="source-line-no">082</span><span id="line-82"> * @return a 32-bit value. Every bit of the key affects every bit of the return value. Two keys</span> |
| <span class="source-line-no">083</span><span id="line-83"> * differing by one or two bits will have totally different hash values.</span> |
| <span class="source-line-no">084</span><span id="line-84"> * <p></span> |
| <span class="source-line-no">085</span><span id="line-85"> * The best hash table sizes are powers of 2. There is no need to do mod a prime (mod is</span> |
| <span class="source-line-no">086</span><span id="line-86"> * sooo slow!). If you need less than 32 bits, use a bitmask. For example, if you need</span> |
| <span class="source-line-no">087</span><span id="line-87"> * only 10 bits, do <code>h = (h &amp; hashmask(10));</code> In which case, the hash table</span> |
| <span class="source-line-no">088</span><span id="line-88"> * should have hashsize(10) elements.</span> |
| <span class="source-line-no">089</span><span id="line-89"> * <p></span> |
| <span class="source-line-no">090</span><span id="line-90"> * If you are hashing n strings byte[][] k, do it like this: for (int i = 0, h = 0; i &lt;</span> |
| <span class="source-line-no">091</span><span id="line-91"> * n; ++i) h = hash( k[i], h);</span> |
| <span class="source-line-no">092</span><span id="line-92"> * <p></span> |
| <span class="source-line-no">093</span><span id="line-93"> * By Bob Jenkins, 2006. bob_jenkins@burtleburtle.net. You may use this code any way you</span> |
| <span class="source-line-no">094</span><span id="line-94"> * wish, private, educational, or commercial. It's free.</span> |
| <span class="source-line-no">095</span><span id="line-95"> * <p></span> |
| <span class="source-line-no">096</span><span id="line-96"> * Use for hash table lookup, or anything where one collision in 2^^32 is acceptable. Do</span> |
| <span class="source-line-no">097</span><span id="line-97"> * NOT use for cryptographic purposes.</span> |
| <span class="source-line-no">098</span><span id="line-98"> */</span> |
| <span class="source-line-no">099</span><span id="line-99"> @SuppressWarnings({ "fallthrough", "MissingDefault" })</span> |
| <span class="source-line-no">100</span><span id="line-100"> @Override</span> |
| <span class="source-line-no">101</span><span id="line-101"> public <T> int hash(HashKey<T> hashKey, int initval) {</span> |
| <span class="source-line-no">102</span><span id="line-102"> int length = hashKey.length();</span> |
| <span class="source-line-no">103</span><span id="line-103"> int a, b, c;</span> |
| <span class="source-line-no">104</span><span id="line-104"> a = b = c = 0xdeadbeef + length + initval;</span> |
| <span class="source-line-no">105</span><span id="line-105"> int offset = 0;</span> |
| <span class="source-line-no">106</span><span id="line-106"> for (; length > 12; offset += 12, length -= 12) {</span> |
| <span class="source-line-no">107</span><span id="line-107"> a += (hashKey.get(offset) & BYTE_MASK);</span> |
| <span class="source-line-no">108</span><span id="line-108"> a += ((hashKey.get(offset + 1) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">109</span><span id="line-109"> a += ((hashKey.get(offset + 2) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">110</span><span id="line-110"> a += ((hashKey.get(offset + 3) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">111</span><span id="line-111"> b += (hashKey.get(offset + 4) & BYTE_MASK);</span> |
| <span class="source-line-no">112</span><span id="line-112"> b += ((hashKey.get(offset + 5) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">113</span><span id="line-113"> b += ((hashKey.get(offset + 6) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">114</span><span id="line-114"> b += ((hashKey.get(offset + 7) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">115</span><span id="line-115"> c += (hashKey.get(offset + 8) & BYTE_MASK);</span> |
| <span class="source-line-no">116</span><span id="line-116"> c += ((hashKey.get(offset + 9) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">117</span><span id="line-117"> c += ((hashKey.get(offset + 10) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">118</span><span id="line-118"> c += ((hashKey.get(offset + 11) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">119</span><span id="line-119"></span> |
| <span class="source-line-no">120</span><span id="line-120"> /*</span> |
| <span class="source-line-no">121</span><span id="line-121"> * mix -- mix 3 32-bit values reversibly. This is reversible, so any information in (a,b,c)</span> |
| <span class="source-line-no">122</span><span id="line-122"> * before mix() is still in (a,b,c) after mix(). If four pairs of (a,b,c) inputs are run</span> |
| <span class="source-line-no">123</span><span id="line-123"> * through mix(), or through mix() in reverse, there are at least 32 bits of the output that</span> |
| <span class="source-line-no">124</span><span id="line-124"> * are sometimes the same for one pair and different for another pair. This was tested for: -</span> |
| <span class="source-line-no">125</span><span id="line-125"> * pairs that differed by one bit, by two bits, in any combination of top bits of (a,b,c), or</span> |
| <span class="source-line-no">126</span><span id="line-126"> * in any combination of bottom bits of (a,b,c). - "differ" is defined as +, -, ^, or ~^. For</span> |
| <span class="source-line-no">127</span><span id="line-127"> * + and -, I transformed the output delta to a Gray code (a^(a>>1)) so a string of 1's (as is</span> |
| <span class="source-line-no">128</span><span id="line-128"> * commonly produced by subtraction) look like a single 1-bit difference. - the base values</span> |
| <span class="source-line-no">129</span><span id="line-129"> * were pseudorandom, all zero but one bit set, or all zero plus a counter that starts at</span> |
| <span class="source-line-no">130</span><span id="line-130"> * zero. Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that satisfy this are 4 6</span> |
| <span class="source-line-no">131</span><span id="line-131"> * 8 16 19 4 9 15 3 18 27 15 14 9 3 7 17 3 Well, "9 15 3 18 27 15" didn't quite get 32 bits</span> |
| <span class="source-line-no">132</span><span id="line-132"> * diffing for "differ" defined as + with a one-bit base and a two-bit delta. I used</span> |
| <span class="source-line-no">133</span><span id="line-133"> * http://burtleburtle.net/bob/hash/avalanche.html to choose the operations, constants, and</span> |
| <span class="source-line-no">134</span><span id="line-134"> * arrangements of the variables. This does not achieve avalanche. There are input bits of</span> |
| <span class="source-line-no">135</span><span id="line-135"> * (a,b,c) that fail to affect some output bits of (a,b,c), especially of a. The most</span> |
| <span class="source-line-no">136</span><span id="line-136"> * thoroughly mixed value is c, but it doesn't really even achieve avalanche in c. This allows</span> |
| <span class="source-line-no">137</span><span id="line-137"> * some parallelism. Read-after-writes are good at doubling the number of bits affected, so</span> |
| <span class="source-line-no">138</span><span id="line-138"> * the goal of mixing pulls in the opposite direction as the goal of parallelism. I did what I</span> |
| <span class="source-line-no">139</span><span id="line-139"> * could. Rotates seem to cost as much as shifts on every machine I could lay my hands on, and</span> |
| <span class="source-line-no">140</span><span id="line-140"> * rotates are much kinder to the top and bottom bits, so I used rotates. #define mix(a,b,c) \</span> |
| <span class="source-line-no">141</span><span id="line-141"> * { \ a -= c; a ^= rot(c, 4); c += b; \ b -= a; b ^= rot(a, 6); a += c; \ c -= b; c ^= rot(b,</span> |
| <span class="source-line-no">142</span><span id="line-142"> * 8); b += a; \ a -= c; a ^= rot(c,16); c += b; \ b -= a; b ^= rot(a,19); a += c; \ c -= b; c</span> |
| <span class="source-line-no">143</span><span id="line-143"> * ^= rot(b, 4); b += a; \ } mix(a,b,c);</span> |
| <span class="source-line-no">144</span><span id="line-144"> */</span> |
| <span class="source-line-no">145</span><span id="line-145"> a -= c;</span> |
| <span class="source-line-no">146</span><span id="line-146"> a ^= rotateLeft(c, 4);</span> |
| <span class="source-line-no">147</span><span id="line-147"> c += b;</span> |
| <span class="source-line-no">148</span><span id="line-148"> b -= a;</span> |
| <span class="source-line-no">149</span><span id="line-149"> b ^= rotateLeft(a, 6);</span> |
| <span class="source-line-no">150</span><span id="line-150"> a += c;</span> |
| <span class="source-line-no">151</span><span id="line-151"> c -= b;</span> |
| <span class="source-line-no">152</span><span id="line-152"> c ^= rotateLeft(b, 8);</span> |
| <span class="source-line-no">153</span><span id="line-153"> b += a;</span> |
| <span class="source-line-no">154</span><span id="line-154"> a -= c;</span> |
| <span class="source-line-no">155</span><span id="line-155"> a ^= rotateLeft(c, 16);</span> |
| <span class="source-line-no">156</span><span id="line-156"> c += b;</span> |
| <span class="source-line-no">157</span><span id="line-157"> b -= a;</span> |
| <span class="source-line-no">158</span><span id="line-158"> b ^= rotateLeft(a, 19);</span> |
| <span class="source-line-no">159</span><span id="line-159"> a += c;</span> |
| <span class="source-line-no">160</span><span id="line-160"> c -= b;</span> |
| <span class="source-line-no">161</span><span id="line-161"> c ^= rotateLeft(b, 4);</span> |
| <span class="source-line-no">162</span><span id="line-162"> b += a;</span> |
| <span class="source-line-no">163</span><span id="line-163"> }</span> |
| <span class="source-line-no">164</span><span id="line-164"></span> |
| <span class="source-line-no">165</span><span id="line-165"> // -------------------------------- last block: affect all 32 bits of (c)</span> |
| <span class="source-line-no">166</span><span id="line-166"> switch (length) { // all the case statements fall through</span> |
| <span class="source-line-no">167</span><span id="line-167"> case 12:</span> |
| <span class="source-line-no">168</span><span id="line-168"> c += ((hashKey.get(offset + 11) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">169</span><span id="line-169"> case 11:</span> |
| <span class="source-line-no">170</span><span id="line-170"> c += ((hashKey.get(offset + 10) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">171</span><span id="line-171"> case 10:</span> |
| <span class="source-line-no">172</span><span id="line-172"> c += ((hashKey.get(offset + 9) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">173</span><span id="line-173"> case 9:</span> |
| <span class="source-line-no">174</span><span id="line-174"> c += (hashKey.get(offset + 8) & BYTE_MASK);</span> |
| <span class="source-line-no">175</span><span id="line-175"> case 8:</span> |
| <span class="source-line-no">176</span><span id="line-176"> b += ((hashKey.get(offset + 7) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">177</span><span id="line-177"> case 7:</span> |
| <span class="source-line-no">178</span><span id="line-178"> b += ((hashKey.get(offset + 6) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">179</span><span id="line-179"> case 6:</span> |
| <span class="source-line-no">180</span><span id="line-180"> b += ((hashKey.get(offset + 5) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">181</span><span id="line-181"> case 5:</span> |
| <span class="source-line-no">182</span><span id="line-182"> b += (hashKey.get(offset + 4) & BYTE_MASK);</span> |
| <span class="source-line-no">183</span><span id="line-183"> case 4:</span> |
| <span class="source-line-no">184</span><span id="line-184"> a += ((hashKey.get(offset + 3) & BYTE_MASK) << 24);</span> |
| <span class="source-line-no">185</span><span id="line-185"> case 3:</span> |
| <span class="source-line-no">186</span><span id="line-186"> a += ((hashKey.get(offset + 2) & BYTE_MASK) << 16);</span> |
| <span class="source-line-no">187</span><span id="line-187"> case 2:</span> |
| <span class="source-line-no">188</span><span id="line-188"> a += ((hashKey.get(offset + 1) & BYTE_MASK) << 8);</span> |
| <span class="source-line-no">189</span><span id="line-189"> case 1:</span> |
| <span class="source-line-no">190</span><span id="line-190"> // noinspection PointlessArithmeticExpression</span> |
| <span class="source-line-no">191</span><span id="line-191"> a += (hashKey.get(offset + 0) & BYTE_MASK);</span> |
| <span class="source-line-no">192</span><span id="line-192"> break;</span> |
| <span class="source-line-no">193</span><span id="line-193"> case 0:</span> |
| <span class="source-line-no">194</span><span id="line-194"> return c;</span> |
| <span class="source-line-no">195</span><span id="line-195"> }</span> |
| <span class="source-line-no">196</span><span id="line-196"> /*</span> |
| <span class="source-line-no">197</span><span id="line-197"> * final -- final mixing of 3 32-bit values (a,b,c) into c Pairs of (a,b,c) values differing in</span> |
| <span class="source-line-no">198</span><span id="line-198"> * only a few bits will usually produce values of c that look totally different. This was tested</span> |
| <span class="source-line-no">199</span><span id="line-199"> * for - pairs that differed by one bit, by two bits, in any combination of top bits of (a,b,c),</span> |
| <span class="source-line-no">200</span><span id="line-200"> * or in any combination of bottom bits of (a,b,c). - "differ" is defined as +, -, ^, or ~^. For</span> |
| <span class="source-line-no">201</span><span id="line-201"> * + and -, I transformed the output delta to a Gray code (a^(a>>1)) so a string of 1's (as is</span> |
| <span class="source-line-no">202</span><span id="line-202"> * commonly produced by subtraction) look like a single 1-bit difference. - the base values were</span> |
| <span class="source-line-no">203</span><span id="line-203"> * pseudorandom, all zero but one bit set, or all zero plus a counter that starts at zero. These</span> |
| <span class="source-line-no">204</span><span id="line-204"> * constants passed: 14 11 25 16 4 14 24 12 14 25 16 4 14 24 and these came close: 4 8 15 26 3</span> |
| <span class="source-line-no">205</span><span id="line-205"> * 22 24 10 8 15 26 3 22 24 11 8 15 26 3 22 24 #define final(a,b,c) \ { c ^= b; c -= rot(b,14);</span> |
| <span class="source-line-no">206</span><span id="line-206"> * \ a ^= c; a -= rot(c,11); \ b ^= a; b -= rot(a,25); \ c ^= b; c -= rot(b,16); \ a ^= c; a -=</span> |
| <span class="source-line-no">207</span><span id="line-207"> * rot(c,4); \ b ^= a; b -= rot(a,14); \ c ^= b; c -= rot(b,24); \ }</span> |
| <span class="source-line-no">208</span><span id="line-208"> */</span> |
| <span class="source-line-no">209</span><span id="line-209"> c ^= b;</span> |
| <span class="source-line-no">210</span><span id="line-210"> c -= rotateLeft(b, 14);</span> |
| <span class="source-line-no">211</span><span id="line-211"> a ^= c;</span> |
| <span class="source-line-no">212</span><span id="line-212"> a -= rotateLeft(c, 11);</span> |
| <span class="source-line-no">213</span><span id="line-213"> b ^= a;</span> |
| <span class="source-line-no">214</span><span id="line-214"> b -= rotateLeft(a, 25);</span> |
| <span class="source-line-no">215</span><span id="line-215"> c ^= b;</span> |
| <span class="source-line-no">216</span><span id="line-216"> c -= rotateLeft(b, 16);</span> |
| <span class="source-line-no">217</span><span id="line-217"> a ^= c;</span> |
| <span class="source-line-no">218</span><span id="line-218"> a -= rotateLeft(c, 4);</span> |
| <span class="source-line-no">219</span><span id="line-219"> b ^= a;</span> |
| <span class="source-line-no">220</span><span id="line-220"> b -= rotateLeft(a, 14);</span> |
| <span class="source-line-no">221</span><span id="line-221"> c ^= b;</span> |
| <span class="source-line-no">222</span><span id="line-222"> c -= rotateLeft(b, 24);</span> |
| <span class="source-line-no">223</span><span id="line-223"> return c;</span> |
| <span class="source-line-no">224</span><span id="line-224"> }</span> |
| <span class="source-line-no">225</span><span id="line-225">}</span> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |