341 lines
13 KiB
Java
341 lines
13 KiB
Java
|
package com.google.common.hash;
|
||
|
|
||
|
import com.google.common.base.Charsets;
|
||
|
import com.google.common.base.Preconditions;
|
||
|
import com.google.common.primitives.Ints;
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import com.kofax.mobile.sdk._internal.impl.camera.h;
|
||
|
import io.flutter.embedding.android.KeyboardMap;
|
||
|
import java.io.Serializable;
|
||
|
import java.nio.ByteBuffer;
|
||
|
import java.nio.ByteOrder;
|
||
|
import java.nio.charset.Charset;
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
/* loaded from: classes2.dex */
|
||
|
public final class Murmur3_32HashFunction extends AbstractHashFunction implements Serializable {
|
||
|
private static final int C1 = -862048943;
|
||
|
private static final int C2 = 461845907;
|
||
|
private static final int CHUNK_SIZE = 4;
|
||
|
private static final long serialVersionUID = 0;
|
||
|
private final int seed;
|
||
|
static final HashFunction MURMUR3_32 = new Murmur3_32HashFunction(0);
|
||
|
static final HashFunction GOOD_FAST_HASH_32 = new Murmur3_32HashFunction(Hashing.GOOD_FAST_HASH_SEED);
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static long charToThreeUtf8Bytes(char c) {
|
||
|
return ((((c >>> 6) & 63) | 128) << 8) | (((c >>> '\f') | h.Az) & 255) | (((c & '?') | 128) << 16);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static long charToTwoUtf8Bytes(char c) {
|
||
|
return (((c >>> 6) | 960) & 255) | (((c & '?') | 128) << 8);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static long codePointToFourUtf8Bytes(int i) {
|
||
|
return (((i >>> 18) | 240) & 255) | ((((i >>> 12) & 63) | 128) << 8) | ((((i >>> 6) & 63) | 128) << 16) | (((i & 63) | 128) << 24);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.HashFunction
|
||
|
public final int bits() {
|
||
|
return 32;
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
public Murmur3_32HashFunction(int i) {
|
||
|
this.seed = i;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.HashFunction
|
||
|
public final Hasher newHasher() {
|
||
|
return new Murmur3_32Hasher(this.seed);
|
||
|
}
|
||
|
|
||
|
public final String toString() {
|
||
|
int i = this.seed;
|
||
|
StringBuilder sb = new StringBuilder(31);
|
||
|
sb.append("Hashing.murmur3_32(");
|
||
|
sb.append(i);
|
||
|
sb.append(")");
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
public final boolean equals(Object obj) {
|
||
|
return (obj instanceof Murmur3_32HashFunction) && this.seed == ((Murmur3_32HashFunction) obj).seed;
|
||
|
}
|
||
|
|
||
|
public final int hashCode() {
|
||
|
return getClass().hashCode() ^ this.seed;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHashFunction, com.google.common.hash.HashFunction
|
||
|
public final HashCode hashInt(int i) {
|
||
|
return fmix(mixH1(this.seed, mixK1(i)), 4);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHashFunction, com.google.common.hash.HashFunction
|
||
|
public final HashCode hashLong(long j) {
|
||
|
return fmix(mixH1(mixH1(this.seed, mixK1((int) j)), mixK1((int) (j >>> 32))), 8);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHashFunction, com.google.common.hash.HashFunction
|
||
|
public final HashCode hashUnencodedChars(CharSequence charSequence) {
|
||
|
int i = this.seed;
|
||
|
for (int i2 = 1; i2 < charSequence.length(); i2 += 2) {
|
||
|
i = mixH1(i, mixK1(charSequence.charAt(i2 - 1) | (charSequence.charAt(i2) << 16)));
|
||
|
}
|
||
|
if ((charSequence.length() & 1) == 1) {
|
||
|
i ^= mixK1(charSequence.charAt(charSequence.length() - 1));
|
||
|
}
|
||
|
return fmix(i, charSequence.length() << 1);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHashFunction, com.google.common.hash.HashFunction
|
||
|
public final HashCode hashString(CharSequence charSequence, Charset charset) {
|
||
|
if (Charsets.UTF_8.equals(charset)) {
|
||
|
int length = charSequence.length();
|
||
|
int i = this.seed;
|
||
|
int i2 = 0;
|
||
|
int i3 = 0;
|
||
|
int i4 = 0;
|
||
|
while (true) {
|
||
|
int i5 = i3 + 4;
|
||
|
if (i5 > length) {
|
||
|
break;
|
||
|
}
|
||
|
char charAt = charSequence.charAt(i3);
|
||
|
char charAt2 = charSequence.charAt(i3 + 1);
|
||
|
char charAt3 = charSequence.charAt(i3 + 2);
|
||
|
char charAt4 = charSequence.charAt(i3 + 3);
|
||
|
if (charAt >= 128 || charAt2 >= 128 || charAt3 >= 128 || charAt4 >= 128) {
|
||
|
break;
|
||
|
}
|
||
|
i = mixH1(i, mixK1((charAt2 << '\b') | charAt | (charAt3 << 16) | (charAt4 << 24)));
|
||
|
i4 += 4;
|
||
|
i3 = i5;
|
||
|
}
|
||
|
long j = 0;
|
||
|
while (i3 < length) {
|
||
|
char charAt5 = charSequence.charAt(i3);
|
||
|
if (charAt5 < 128) {
|
||
|
j |= charAt5 << i2;
|
||
|
i2 += 8;
|
||
|
i4++;
|
||
|
} else if (charAt5 < 2048) {
|
||
|
j |= charToTwoUtf8Bytes(charAt5) << i2;
|
||
|
i2 += 16;
|
||
|
i4 += 2;
|
||
|
} else if (charAt5 < 55296 || charAt5 > 57343) {
|
||
|
j |= charToThreeUtf8Bytes(charAt5) << i2;
|
||
|
i2 += 24;
|
||
|
i4 += 3;
|
||
|
} else {
|
||
|
int codePointAt = Character.codePointAt(charSequence, i3);
|
||
|
if (codePointAt == charAt5) {
|
||
|
return hashBytes(charSequence.toString().getBytes(charset));
|
||
|
}
|
||
|
i3++;
|
||
|
j |= codePointToFourUtf8Bytes(codePointAt) << i2;
|
||
|
i4 += 4;
|
||
|
}
|
||
|
if (i2 >= 32) {
|
||
|
i = mixH1(i, mixK1((int) j));
|
||
|
j >>>= 32;
|
||
|
i2 -= 32;
|
||
|
}
|
||
|
i3++;
|
||
|
}
|
||
|
return fmix(mixK1((int) j) ^ i, i4);
|
||
|
}
|
||
|
return hashBytes(charSequence.toString().getBytes(charset));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHashFunction, com.google.common.hash.HashFunction
|
||
|
public final HashCode hashBytes(byte[] bArr, int i, int i2) {
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
int i3 = this.seed;
|
||
|
int i4 = 0;
|
||
|
int i5 = 0;
|
||
|
while (true) {
|
||
|
int i6 = i5 + 4;
|
||
|
if (i6 > i2) {
|
||
|
break;
|
||
|
}
|
||
|
i3 = mixH1(i3, mixK1(getIntLittleEndian(bArr, i5 + i)));
|
||
|
i5 = i6;
|
||
|
}
|
||
|
int i7 = i5;
|
||
|
int i8 = 0;
|
||
|
while (i7 < i2) {
|
||
|
i4 ^= UnsignedBytes.toInt(bArr[i + i7]) << i8;
|
||
|
i7++;
|
||
|
i8 += 8;
|
||
|
}
|
||
|
return fmix(mixK1(i4) ^ i3, i2);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static int getIntLittleEndian(byte[] bArr, int i) {
|
||
|
return Ints.fromBytes(bArr[i + 3], bArr[i + 2], bArr[i + 1], bArr[i]);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static int mixK1(int i) {
|
||
|
return Integer.rotateLeft(i * C1, 15) * C2;
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static int mixH1(int i, int i2) {
|
||
|
return (Integer.rotateLeft(i ^ i2, 13) * 5) - 430675100;
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
public static HashCode fmix(int i, int i2) {
|
||
|
int i3 = i ^ i2;
|
||
|
int i4 = (i3 ^ (i3 >>> 16)) * (-2048144789);
|
||
|
int i5 = (i4 ^ (i4 >>> 13)) * (-1028477387);
|
||
|
return HashCode.fromInt(i5 ^ (i5 >>> 16));
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static final class Murmur3_32Hasher extends AbstractHasher {
|
||
|
private long buffer;
|
||
|
private int h1;
|
||
|
private int shift;
|
||
|
private int length = 0;
|
||
|
private boolean isDone = false;
|
||
|
|
||
|
Murmur3_32Hasher(int i) {
|
||
|
this.h1 = i;
|
||
|
}
|
||
|
|
||
|
private void update(int i, long j) {
|
||
|
long j2 = this.buffer;
|
||
|
int i2 = this.shift;
|
||
|
long j3 = ((j & KeyboardMap.kValueMask) << i2) | j2;
|
||
|
this.buffer = j3;
|
||
|
int i3 = i2 + (i << 3);
|
||
|
this.shift = i3;
|
||
|
this.length += i;
|
||
|
if (i3 >= 32) {
|
||
|
this.h1 = Murmur3_32HashFunction.mixH1(this.h1, Murmur3_32HashFunction.mixK1((int) j3));
|
||
|
this.buffer >>>= 32;
|
||
|
this.shift -= 32;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putByte(byte b) {
|
||
|
update(1, b & UnsignedBytes.MAX_VALUE);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putBytes(byte[] bArr, int i, int i2) {
|
||
|
Preconditions.checkPositionIndexes(i, i + i2, bArr.length);
|
||
|
int i3 = 0;
|
||
|
while (true) {
|
||
|
int i4 = i3 + 4;
|
||
|
if (i4 > i2) {
|
||
|
break;
|
||
|
}
|
||
|
update(4, Murmur3_32HashFunction.getIntLittleEndian(bArr, i3 + i));
|
||
|
i3 = i4;
|
||
|
}
|
||
|
while (i3 < i2) {
|
||
|
putByte(bArr[i + i3]);
|
||
|
i3++;
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putBytes(ByteBuffer byteBuffer) {
|
||
|
ByteOrder order = byteBuffer.order();
|
||
|
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
|
||
|
while (byteBuffer.remaining() >= 4) {
|
||
|
putInt(byteBuffer.getInt());
|
||
|
}
|
||
|
while (byteBuffer.hasRemaining()) {
|
||
|
putByte(byteBuffer.get());
|
||
|
}
|
||
|
byteBuffer.order(order);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putInt(int i) {
|
||
|
update(4, i);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putLong(long j) {
|
||
|
update(4, (int) j);
|
||
|
update(4, j >>> 32);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putChar(char c) {
|
||
|
update(2, c);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractHasher, com.google.common.hash.PrimitiveSink
|
||
|
public final Hasher putString(CharSequence charSequence, Charset charset) {
|
||
|
if (Charsets.UTF_8.equals(charset)) {
|
||
|
int length = charSequence.length();
|
||
|
int i = 0;
|
||
|
while (true) {
|
||
|
int i2 = i + 4;
|
||
|
if (i2 > length) {
|
||
|
break;
|
||
|
}
|
||
|
char charAt = charSequence.charAt(i);
|
||
|
char charAt2 = charSequence.charAt(i + 1);
|
||
|
char charAt3 = charSequence.charAt(i + 2);
|
||
|
char charAt4 = charSequence.charAt(i + 3);
|
||
|
if (charAt >= 128 || charAt2 >= 128 || charAt3 >= 128 || charAt4 >= 128) {
|
||
|
break;
|
||
|
}
|
||
|
update(4, (charAt2 << '\b') | charAt | (charAt3 << 16) | (charAt4 << 24));
|
||
|
i = i2;
|
||
|
}
|
||
|
while (i < length) {
|
||
|
char charAt5 = charSequence.charAt(i);
|
||
|
if (charAt5 < 128) {
|
||
|
update(1, charAt5);
|
||
|
} else if (charAt5 < 2048) {
|
||
|
update(2, Murmur3_32HashFunction.charToTwoUtf8Bytes(charAt5));
|
||
|
} else if (charAt5 < 55296 || charAt5 > 57343) {
|
||
|
update(3, Murmur3_32HashFunction.charToThreeUtf8Bytes(charAt5));
|
||
|
} else {
|
||
|
int codePointAt = Character.codePointAt(charSequence, i);
|
||
|
if (codePointAt != charAt5) {
|
||
|
i++;
|
||
|
update(4, Murmur3_32HashFunction.codePointToFourUtf8Bytes(codePointAt));
|
||
|
} else {
|
||
|
putBytes(charSequence.subSequence(i, length).toString().getBytes(charset));
|
||
|
return this;
|
||
|
}
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
return super.putString(charSequence, charset);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.Hasher
|
||
|
public final HashCode hash() {
|
||
|
Preconditions.checkState(!this.isDone);
|
||
|
this.isDone = true;
|
||
|
int mixK1 = this.h1 ^ Murmur3_32HashFunction.mixK1((int) this.buffer);
|
||
|
this.h1 = mixK1;
|
||
|
return Murmur3_32HashFunction.fmix(mixK1, this.length);
|
||
|
}
|
||
|
}
|
||
|
}
|