diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/CityHash.java b/src/main/java/com/microsoft/sqlserver/jdbc/CityHash.java
deleted file mode 100644
index e8d21c73fd..0000000000
--- a/src/main/java/com/microsoft/sqlserver/jdbc/CityHash.java
+++ /dev/null
@@ -1,333 +0,0 @@
-package com.microsoft.sqlserver.jdbc;
-
-/**
- * Copyright (C) 2012 tamtam180
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * @author tamtam180 - kirscheless at gmail.com
- * @see http://google-opensource.blogspot.jp/2011/04/introducing-cityhash.html
- * @see http://code.google.com/p/cityhash/
- */
-final class CityHash {
-
- private static final long k0 = 0xc3a5c85c97cb3127L;
- private static final long k1 = 0xb492b66fbe98f273L;
- private static final long k2 = 0x9ae16a3b2f90404fL;
- private static final long k3 = 0xc949d7c7509e6557L;
-
- private static long toLongLE(byte[] b, int i) {
- return (((long) b[i + 7] << 56) + ((long) (b[i + 6] & 255) << 48)
- + ((long) (b[i + 5] & 255) << 40)
- + ((long) (b[i + 4] & 255) << 32)
- + ((long) (b[i + 3] & 255) << 24) + ((b[i + 2] & 255) << 16)
- + ((b[i + 1] & 255) << 8) + ((b[i + 0] & 255) << 0));
- }
-
- private static int toIntLE(byte[] b, int i) {
- return (((b[i + 3] & 255) << 24) + ((b[i + 2] & 255) << 16)
- + ((b[i + 1] & 255) << 8) + ((b[i + 0] & 255) << 0));
- }
-
- private static long fetch64(byte[] s, int pos) {
- return toLongLE(s, pos);
- }
-
- private static int fetch32(byte[] s, int pos) {
- return toIntLE(s, pos);
- }
-
- private static long rotate(long val, int shift) {
- return shift == 0 ? val : (val >>> shift) | (val << (64 - shift));
- }
-
- private static long rotateByAtLeast1(long val, int shift) {
- return (val >>> shift) | (val << (64 - shift));
- }
-
- private static long shiftMix(long val) {
- return val ^ (val >>> 47);
- }
-
- private static final long kMul = 0x9ddfea08eb382d69L;
-
- private static long hash128to64(long u, long v) {
- long a = (u ^ v) * kMul;
- a ^= (a >>> 47);
- long b = (v ^ a) * kMul;
- b ^= (b >>> 47);
- b *= kMul;
- return b;
- }
-
- private static long hashLen16(long u, long v) {
- return hash128to64(u, v);
- }
-
- private static long hashLen0to16(byte[] s, int pos, int len) {
- if (len > 8) {
- long a = fetch64(s, pos + 0);
- long b = fetch64(s, pos + len - 8);
- return hashLen16(a, rotateByAtLeast1(b + len, len)) ^ b;
- }
- if (len >= 4) {
- long a = 0xffffffffL & fetch32(s, pos + 0);
- return hashLen16((a << 3) + len,
- 0xffffffffL & fetch32(s, pos + len - 4));
- }
- if (len > 0) {
- int a = s[pos + 0] & 0xFF;
- int b = s[pos + (len >>> 1)] & 0xFF;
- int c = s[pos + len - 1] & 0xFF;
- int y = a + (b << 8);
- int z = len + (c << 2);
- return shiftMix(y * k2 ^ z * k3) * k2;
- }
- return k2;
- }
-
- private static long hashLen17to32(byte[] s, int pos, int len) {
- long a = fetch64(s, pos + 0) * k1;
- long b = fetch64(s, pos + 8);
- long c = fetch64(s, pos + len - 8) * k2;
- long d = fetch64(s, pos + len - 16) * k0;
- return hashLen16(rotate(a - b, 43) + rotate(c, 30) + d,
- a + rotate(b ^ k3, 20) - c + len);
- }
-
- private static long[] weakHashLen32WithSeeds(long w, long x, long y, long z,
- long a, long b) {
-
- a += w;
- b = rotate(b + a + z, 21);
- long c = a;
- a += x;
- a += y;
- b += rotate(a, 44);
- return new long[]{a + z, b + c};
- }
-
- private static long[] weakHashLen32WithSeeds(byte[] s, int pos, long a,
- long b) {
- return weakHashLen32WithSeeds(fetch64(s, pos + 0), fetch64(s, pos + 8),
- fetch64(s, pos + 16), fetch64(s, pos + 24), a, b);
- }
-
- private static long hashLen33to64(byte[] s, int pos, int len) {
-
- long z = fetch64(s, pos + 24);
- long a = fetch64(s, pos + 0) + (fetch64(s, pos + len - 16) + len) * k0;
- long b = rotate(a + z, 52);
- long c = rotate(a, 37);
-
- a += fetch64(s, pos + 8);
- c += rotate(a, 7);
- a += fetch64(s, pos + 16);
-
- long vf = a + z;
- long vs = b + rotate(a, 31) + c;
-
- a = fetch64(s, pos + 16) + fetch64(s, pos + len - 32);
- z = fetch64(s, pos + len - 8);
- b = rotate(a + z, 52);
- c = rotate(a, 37);
- a += fetch64(s, pos + len - 24);
- c += rotate(a, 7);
- a += fetch64(s, pos + len - 16);
-
- long wf = a + z;
- long ws = b + rotate(a, 31) + c;
- long r = shiftMix((vf + ws) * k2 + (wf + vs) * k0);
-
- return shiftMix(r * k0 + vs) * k2;
-
- }
-
- static long cityHash64(byte[] s, int pos, int len) {
-
- if (len <= 32) {
- if (len <= 16) {
- return hashLen0to16(s, pos, len);
- } else {
- return hashLen17to32(s, pos, len);
- }
- } else if (len <= 64) {
- return hashLen33to64(s, pos, len);
- }
-
- long x = fetch64(s, pos + len - 40);
- long y = fetch64(s, pos + len - 16) + fetch64(s, pos + len - 56);
- long z = hashLen16(fetch64(s, pos + len - 48) + len,
- fetch64(s, pos + len - 24));
-
- long[] v = weakHashLen32WithSeeds(s, pos + len - 64, len, z);
- long[] w = weakHashLen32WithSeeds(s, pos + len - 32, y + k1, x);
- x = x * k1 + fetch64(s, pos + 0);
-
- len = (len - 1) & (~63);
- do {
- x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
- y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
- x ^= w[1];
- y += v[0] + fetch64(s, pos + 40);
- z = rotate(z + w[0], 33) * k1;
- v = weakHashLen32WithSeeds(s, pos + 0, v[1] * k1, x + w[0]);
- w = weakHashLen32WithSeeds(s, pos + 32, z + w[1],
- y + fetch64(s, pos + 16));
- {
- long swap = z;
- z = x;
- x = swap;
- }
- pos += 64;
- len -= 64;
- } while (len != 0);
-
- return hashLen16(hashLen16(v[0], w[0]) + shiftMix(y) * k1 + z,
- hashLen16(v[1], w[1]) + x);
-
- }
-
- static long cityHash64WithSeed(byte[] s, int pos, int len, long seed) {
- return cityHash64WithSeeds(s, pos, len, k2, seed);
- }
-
- static long cityHash64WithSeeds(byte[] s, int pos, int len, long seed0,
- long seed1) {
- return hashLen16(cityHash64(s, pos, len) - seed0, seed1);
- }
-
- static long[] cityMurmur(byte[] s, int pos, int len, long seed0,
- long seed1) {
-
- long a = seed0;
- long b = seed1;
- long c = 0;
- long d = 0;
-
- int l = len - 16;
- if (l <= 0) {
- a = shiftMix(a * k1) * k1;
- c = b * k1 + hashLen0to16(s, pos, len);
- d = shiftMix(a + (len >= 8 ? fetch64(s, pos + 0) : c));
- } else {
-
- c = hashLen16(fetch64(s, pos + len - 8) + k1, a);
- d = hashLen16(b + len, c + fetch64(s, pos + len - 16));
- a += d;
-
- do {
- a ^= shiftMix(fetch64(s, pos + 0) * k1) * k1;
- a *= k1;
- b ^= a;
- c ^= shiftMix(fetch64(s, pos + 8) * k1) * k1;
- c *= k1;
- d ^= c;
- pos += 16;
- l -= 16;
- } while (l > 0);
- }
-
- a = hashLen16(a, c);
- b = hashLen16(d, b);
-
- return new long[]{a ^ b, hashLen16(b, a)};
-
- }
-
- static long[] cityHash128WithSeed(byte[] s, int pos, int len, long seed0,
- long seed1) {
-
- if (len < 128) {
- return cityMurmur(s, pos, len, seed0, seed1);
- }
-
- long[] v = new long[2], w = new long[2];
- long x = seed0;
- long y = seed1;
- long z = k1 * len;
-
- v[0] = rotate(y ^ k1, 49) * k1 + fetch64(s, pos);
- v[1] = rotate(v[0], 42) * k1 + fetch64(s, pos + 8);
- w[0] = rotate(y + z, 35) * k1 + x;
- w[1] = rotate(x + fetch64(s, pos + 88), 53) * k1;
-
- do {
- x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
- y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
-
- x ^= w[1];
- y += v[0] + fetch64(s, pos + 40);
- z = rotate(z + w[0], 33) * k1;
- v = weakHashLen32WithSeeds(s, pos + 0, v[1] * k1, x + w[0]);
- w = weakHashLen32WithSeeds(s, pos + 32, z + w[1],
- y + fetch64(s, pos + 16));
- {
- long swap = z;
- z = x;
- x = swap;
- }
- pos += 64;
- x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
- y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
- x ^= w[1];
- y += v[0] + fetch64(s, pos + 40);
- z = rotate(z + w[0], 33) * k1;
- v = weakHashLen32WithSeeds(s, pos, v[1] * k1, x + w[0]);
- w = weakHashLen32WithSeeds(s, pos + 32, z + w[1],
- y + fetch64(s, pos + 16));
- {
- long swap = z;
- z = x;
- x = swap;
- }
- pos += 64;
- len -= 128;
- } while (len >= 128);
-
- x += rotate(v[0] + z, 49) * k0;
- z += rotate(w[0], 37) * k0;
-
- for (int tail_done = 0; tail_done < len;) {
- tail_done += 32;
- y = rotate(x + y, 42) * k0 + v[1];
- w[0] += fetch64(s, pos + len - tail_done + 16);
- x = x * k0 + w[0];
- z += w[1] + fetch64(s, pos + len - tail_done);
- w[1] += v[0];
- v = weakHashLen32WithSeeds(s, pos + len - tail_done, v[0] + z,
- v[1]);
- }
-
- x = hashLen16(x, v[0]);
- y = hashLen16(y + z, w[0]);
-
- return new long[]{hashLen16(x + v[1], w[1]) + y,
- hashLen16(x + w[1], y + v[1])};
-
- }
-
- static long[] cityHash128(byte[] s, int pos, int len) {
-
- if (len >= 16) {
- return cityHash128WithSeed(s, pos + 16, len - 16,
- fetch64(s, pos + 0) ^ k3, fetch64(s, pos + 8));
- } else if (len >= 8) {
- return cityHash128WithSeed(new byte[0], 0, 0,
- fetch64(s, pos + 0) ^ (len * k0),
- fetch64(s, pos + len - 8) ^ k1);
- } else {
- return cityHash128WithSeed(s, pos, len, k0, k1);
- }
- }
-}
diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java
index 9b39cad6dc..57fefea735 100644
--- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java
+++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java
@@ -48,6 +48,8 @@
import javax.sql.XAConnection;
import org.ietf.jgss.GSSCredential;
+
+import mssql.googlecode.cityhash.CityHash;
import mssql.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import mssql.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.Builder;
import mssql.googlecode.concurrentlinkedhashmap.EvictionListener;
diff --git a/src/main/java/mssql/googlecode/cityhash/CityHash.java b/src/main/java/mssql/googlecode/cityhash/CityHash.java
new file mode 100644
index 0000000000..2585916e48
--- /dev/null
+++ b/src/main/java/mssql/googlecode/cityhash/CityHash.java
@@ -0,0 +1,358 @@
+package mssql.googlecode.cityhash;
+
+/**
+ * Copyright (C) 2012 tamtam180
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * @author tamtam180 - kirscheless at gmail.com
+ * @see http://google-opensource.blogspot.jp/2011/04/introducing-cityhash.html
+ * @see http://code.google.com/p/cityhash/
+ */
+public final class CityHash {
+
+ private static final long k0 = 0xc3a5c85c97cb3127L;
+ private static final long k1 = 0xb492b66fbe98f273L;
+ private static final long k2 = 0x9ae16a3b2f90404fL;
+ private static final long k3 = 0xc949d7c7509e6557L;
+
+ private static long toLongLE(byte[] b,
+ int i) {
+ return (((long) b[i + 7] << 56) + ((long) (b[i + 6] & 255) << 48) + ((long) (b[i + 5] & 255) << 40) + ((long) (b[i + 4] & 255) << 32)
+ + ((long) (b[i + 3] & 255) << 24) + ((b[i + 2] & 255) << 16) + ((b[i + 1] & 255) << 8) + ((b[i + 0] & 255) << 0));
+ }
+
+ private static int toIntLE(byte[] b,
+ int i) {
+ return (((b[i + 3] & 255) << 24) + ((b[i + 2] & 255) << 16) + ((b[i + 1] & 255) << 8) + ((b[i + 0] & 255) << 0));
+ }
+
+ private static long fetch64(byte[] s,
+ int pos) {
+ return toLongLE(s, pos);
+ }
+
+ private static int fetch32(byte[] s,
+ int pos) {
+ return toIntLE(s, pos);
+ }
+
+ private static long rotate(long val,
+ int shift) {
+ return shift == 0 ? val : (val >>> shift) | (val << (64 - shift));
+ }
+
+ private static long rotateByAtLeast1(long val,
+ int shift) {
+ return (val >>> shift) | (val << (64 - shift));
+ }
+
+ private static long shiftMix(long val) {
+ return val ^ (val >>> 47);
+ }
+
+ private static final long kMul = 0x9ddfea08eb382d69L;
+
+ private static long hash128to64(long u,
+ long v) {
+ long a = (u ^ v) * kMul;
+ a ^= (a >>> 47);
+ long b = (v ^ a) * kMul;
+ b ^= (b >>> 47);
+ b *= kMul;
+ return b;
+ }
+
+ private static long hashLen16(long u,
+ long v) {
+ return hash128to64(u, v);
+ }
+
+ private static long hashLen0to16(byte[] s,
+ int pos,
+ int len) {
+ if (len > 8) {
+ long a = fetch64(s, pos + 0);
+ long b = fetch64(s, pos + len - 8);
+ return hashLen16(a, rotateByAtLeast1(b + len, len)) ^ b;
+ }
+ if (len >= 4) {
+ long a = 0xffffffffL & fetch32(s, pos + 0);
+ return hashLen16((a << 3) + len, 0xffffffffL & fetch32(s, pos + len - 4));
+ }
+ if (len > 0) {
+ int a = s[pos + 0] & 0xFF;
+ int b = s[pos + (len >>> 1)] & 0xFF;
+ int c = s[pos + len - 1] & 0xFF;
+ int y = a + (b << 8);
+ int z = len + (c << 2);
+ return shiftMix(y * k2 ^ z * k3) * k2;
+ }
+ return k2;
+ }
+
+ private static long hashLen17to32(byte[] s,
+ int pos,
+ int len) {
+ long a = fetch64(s, pos + 0) * k1;
+ long b = fetch64(s, pos + 8);
+ long c = fetch64(s, pos + len - 8) * k2;
+ long d = fetch64(s, pos + len - 16) * k0;
+ return hashLen16(rotate(a - b, 43) + rotate(c, 30) + d, a + rotate(b ^ k3, 20) - c + len);
+ }
+
+ private static long[] weakHashLen32WithSeeds(long w,
+ long x,
+ long y,
+ long z,
+ long a,
+ long b) {
+
+ a += w;
+ b = rotate(b + a + z, 21);
+ long c = a;
+ a += x;
+ a += y;
+ b += rotate(a, 44);
+ return new long[] {a + z, b + c};
+ }
+
+ private static long[] weakHashLen32WithSeeds(byte[] s,
+ int pos,
+ long a,
+ long b) {
+ return weakHashLen32WithSeeds(fetch64(s, pos + 0), fetch64(s, pos + 8), fetch64(s, pos + 16), fetch64(s, pos + 24), a, b);
+ }
+
+ private static long hashLen33to64(byte[] s,
+ int pos,
+ int len) {
+
+ long z = fetch64(s, pos + 24);
+ long a = fetch64(s, pos + 0) + (fetch64(s, pos + len - 16) + len) * k0;
+ long b = rotate(a + z, 52);
+ long c = rotate(a, 37);
+
+ a += fetch64(s, pos + 8);
+ c += rotate(a, 7);
+ a += fetch64(s, pos + 16);
+
+ long vf = a + z;
+ long vs = b + rotate(a, 31) + c;
+
+ a = fetch64(s, pos + 16) + fetch64(s, pos + len - 32);
+ z = fetch64(s, pos + len - 8);
+ b = rotate(a + z, 52);
+ c = rotate(a, 37);
+ a += fetch64(s, pos + len - 24);
+ c += rotate(a, 7);
+ a += fetch64(s, pos + len - 16);
+
+ long wf = a + z;
+ long ws = b + rotate(a, 31) + c;
+ long r = shiftMix((vf + ws) * k2 + (wf + vs) * k0);
+
+ return shiftMix(r * k0 + vs) * k2;
+
+ }
+
+ static long cityHash64(byte[] s,
+ int pos,
+ int len) {
+
+ if (len <= 32) {
+ if (len <= 16) {
+ return hashLen0to16(s, pos, len);
+ }
+ else {
+ return hashLen17to32(s, pos, len);
+ }
+ }
+ else if (len <= 64) {
+ return hashLen33to64(s, pos, len);
+ }
+
+ long x = fetch64(s, pos + len - 40);
+ long y = fetch64(s, pos + len - 16) + fetch64(s, pos + len - 56);
+ long z = hashLen16(fetch64(s, pos + len - 48) + len, fetch64(s, pos + len - 24));
+
+ long[] v = weakHashLen32WithSeeds(s, pos + len - 64, len, z);
+ long[] w = weakHashLen32WithSeeds(s, pos + len - 32, y + k1, x);
+ x = x * k1 + fetch64(s, pos + 0);
+
+ len = (len - 1) & (~63);
+ do {
+ x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
+ y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
+ x ^= w[1];
+ y += v[0] + fetch64(s, pos + 40);
+ z = rotate(z + w[0], 33) * k1;
+ v = weakHashLen32WithSeeds(s, pos + 0, v[1] * k1, x + w[0]);
+ w = weakHashLen32WithSeeds(s, pos + 32, z + w[1], y + fetch64(s, pos + 16));
+ {
+ long swap = z;
+ z = x;
+ x = swap;
+ }
+ pos += 64;
+ len -= 64;
+ }
+ while (len != 0);
+
+ return hashLen16(hashLen16(v[0], w[0]) + shiftMix(y) * k1 + z, hashLen16(v[1], w[1]) + x);
+
+ }
+
+ static long cityHash64WithSeed(byte[] s,
+ int pos,
+ int len,
+ long seed) {
+ return cityHash64WithSeeds(s, pos, len, k2, seed);
+ }
+
+ static long cityHash64WithSeeds(byte[] s,
+ int pos,
+ int len,
+ long seed0,
+ long seed1) {
+ return hashLen16(cityHash64(s, pos, len) - seed0, seed1);
+ }
+
+ static long[] cityMurmur(byte[] s,
+ int pos,
+ int len,
+ long seed0,
+ long seed1) {
+
+ long a = seed0;
+ long b = seed1;
+ long c = 0;
+ long d = 0;
+
+ int l = len - 16;
+ if (l <= 0) {
+ a = shiftMix(a * k1) * k1;
+ c = b * k1 + hashLen0to16(s, pos, len);
+ d = shiftMix(a + (len >= 8 ? fetch64(s, pos + 0) : c));
+ }
+ else {
+
+ c = hashLen16(fetch64(s, pos + len - 8) + k1, a);
+ d = hashLen16(b + len, c + fetch64(s, pos + len - 16));
+ a += d;
+
+ do {
+ a ^= shiftMix(fetch64(s, pos + 0) * k1) * k1;
+ a *= k1;
+ b ^= a;
+ c ^= shiftMix(fetch64(s, pos + 8) * k1) * k1;
+ c *= k1;
+ d ^= c;
+ pos += 16;
+ l -= 16;
+ }
+ while (l > 0);
+ }
+
+ a = hashLen16(a, c);
+ b = hashLen16(d, b);
+
+ return new long[] {a ^ b, hashLen16(b, a)};
+
+ }
+
+ static long[] cityHash128WithSeed(byte[] s,
+ int pos,
+ int len,
+ long seed0,
+ long seed1) {
+
+ if (len < 128) {
+ return cityMurmur(s, pos, len, seed0, seed1);
+ }
+
+ long[] v = new long[2], w = new long[2];
+ long x = seed0;
+ long y = seed1;
+ long z = k1 * len;
+
+ v[0] = rotate(y ^ k1, 49) * k1 + fetch64(s, pos);
+ v[1] = rotate(v[0], 42) * k1 + fetch64(s, pos + 8);
+ w[0] = rotate(y + z, 35) * k1 + x;
+ w[1] = rotate(x + fetch64(s, pos + 88), 53) * k1;
+
+ do {
+ x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
+ y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
+
+ x ^= w[1];
+ y += v[0] + fetch64(s, pos + 40);
+ z = rotate(z + w[0], 33) * k1;
+ v = weakHashLen32WithSeeds(s, pos + 0, v[1] * k1, x + w[0]);
+ w = weakHashLen32WithSeeds(s, pos + 32, z + w[1], y + fetch64(s, pos + 16));
+ {
+ long swap = z;
+ z = x;
+ x = swap;
+ }
+ pos += 64;
+ x = rotate(x + y + v[0] + fetch64(s, pos + 8), 37) * k1;
+ y = rotate(y + v[1] + fetch64(s, pos + 48), 42) * k1;
+ x ^= w[1];
+ y += v[0] + fetch64(s, pos + 40);
+ z = rotate(z + w[0], 33) * k1;
+ v = weakHashLen32WithSeeds(s, pos, v[1] * k1, x + w[0]);
+ w = weakHashLen32WithSeeds(s, pos + 32, z + w[1], y + fetch64(s, pos + 16));
+ {
+ long swap = z;
+ z = x;
+ x = swap;
+ }
+ pos += 64;
+ len -= 128;
+ }
+ while (len >= 128);
+
+ x += rotate(v[0] + z, 49) * k0;
+ z += rotate(w[0], 37) * k0;
+
+ for (int tail_done = 0; tail_done < len;) {
+ tail_done += 32;
+ y = rotate(x + y, 42) * k0 + v[1];
+ w[0] += fetch64(s, pos + len - tail_done + 16);
+ x = x * k0 + w[0];
+ z += w[1] + fetch64(s, pos + len - tail_done);
+ w[1] += v[0];
+ v = weakHashLen32WithSeeds(s, pos + len - tail_done, v[0] + z, v[1]);
+ }
+
+ x = hashLen16(x, v[0]);
+ y = hashLen16(y + z, w[0]);
+
+ return new long[] {hashLen16(x + v[1], w[1]) + y, hashLen16(x + w[1], y + v[1])};
+
+ }
+
+ public static long[] cityHash128(byte[] s,
+ int pos,
+ int len) {
+
+ if (len >= 16) {
+ return cityHash128WithSeed(s, pos + 16, len - 16, fetch64(s, pos + 0) ^ k3, fetch64(s, pos + 8));
+ }
+ else if (len >= 8) {
+ return cityHash128WithSeed(new byte[0], 0, 0, fetch64(s, pos + 0) ^ (len * k0), fetch64(s, pos + len - 8) ^ k1);
+ }
+ else {
+ return cityHash128WithSeed(s, pos, len, k0, k1);
+ }
+ }
+}
diff --git a/src/main/java/mssql/googlecode/cityhash/LICENSE b/src/main/java/mssql/googlecode/cityhash/LICENSE
new file mode 100644
index 0000000000..261eeb9e9f
--- /dev/null
+++ b/src/main/java/mssql/googlecode/cityhash/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/main/java/mssql/googlecode/cityhash/NOTICE b/src/main/java/mssql/googlecode/cityhash/NOTICE
new file mode 100644
index 0000000000..b8c79f768e
--- /dev/null
+++ b/src/main/java/mssql/googlecode/cityhash/NOTICE
@@ -0,0 +1,5 @@
+CityHash
+Copyright 2012, tamtam180
+
+More information: http://google-opensource.blogspot.jp/2011/04/introducing-cityhash.html
+By Geoff Pike and Jyrki Alakuijala, Software Engineering Team, Google
diff --git a/src/main/java/mssql/googlecode/cityhash/package-info.java b/src/main/java/mssql/googlecode/cityhash/package-info.java
new file mode 100644
index 0000000000..5a4d5748eb
--- /dev/null
+++ b/src/main/java/mssql/googlecode/cityhash/package-info.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright (C) 2012 tamtam180
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * @author tamtam180 - kirscheless at gmail.com
+ * @see http://google-opensource.blogspot.jp/2011/04/introducing-cityhash.html
+ * @see http://code.google.com/p/cityhash/
+ */
+package mssql.googlecode.cityhash;