330 lines
11 KiB
Java
330 lines
11 KiB
Java
|
package com.google.common.hash;
|
||
|
|
||
|
import com.google.common.base.Preconditions;
|
||
|
import java.security.Key;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.Arrays;
|
||
|
import java.util.Iterator;
|
||
|
import java.util.zip.Adler32;
|
||
|
import java.util.zip.CRC32;
|
||
|
import java.util.zip.Checksum;
|
||
|
import javax.crypto.spec.SecretKeySpec;
|
||
|
import org.bouncycastle.pqc.jcajce.spec.McElieceCCA2KeyGenParameterSpec;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
public final class Hashing {
|
||
|
static final int GOOD_FAST_HASH_SEED = (int) System.currentTimeMillis();
|
||
|
|
||
|
public static HashFunction goodFastHash(int i) {
|
||
|
int checkPositiveAndMakeMultipleOf32 = checkPositiveAndMakeMultipleOf32(i);
|
||
|
if (checkPositiveAndMakeMultipleOf32 == 32) {
|
||
|
return Murmur3_32HashFunction.GOOD_FAST_HASH_32;
|
||
|
}
|
||
|
if (checkPositiveAndMakeMultipleOf32 <= 128) {
|
||
|
return Murmur3_128HashFunction.GOOD_FAST_HASH_128;
|
||
|
}
|
||
|
int i2 = (checkPositiveAndMakeMultipleOf32 + 127) / 128;
|
||
|
HashFunction[] hashFunctionArr = new HashFunction[i2];
|
||
|
hashFunctionArr[0] = Murmur3_128HashFunction.GOOD_FAST_HASH_128;
|
||
|
int i3 = GOOD_FAST_HASH_SEED;
|
||
|
for (int i4 = 1; i4 < i2; i4++) {
|
||
|
i3 += 1500450271;
|
||
|
hashFunctionArr[i4] = murmur3_128(i3);
|
||
|
}
|
||
|
return new ConcatenatedHashFunction(hashFunctionArr);
|
||
|
}
|
||
|
|
||
|
public static HashFunction murmur3_32(int i) {
|
||
|
return new Murmur3_32HashFunction(i);
|
||
|
}
|
||
|
|
||
|
public static HashFunction murmur3_32() {
|
||
|
return Murmur3_32HashFunction.MURMUR3_32;
|
||
|
}
|
||
|
|
||
|
public static HashFunction murmur3_128(int i) {
|
||
|
return new Murmur3_128HashFunction(i);
|
||
|
}
|
||
|
|
||
|
public static HashFunction murmur3_128() {
|
||
|
return Murmur3_128HashFunction.MURMUR3_128;
|
||
|
}
|
||
|
|
||
|
public static HashFunction sipHash24() {
|
||
|
return SipHashFunction.SIP_HASH_24;
|
||
|
}
|
||
|
|
||
|
public static HashFunction sipHash24(long j, long j2) {
|
||
|
return new SipHashFunction(2, 4, j, j2);
|
||
|
}
|
||
|
|
||
|
@Deprecated
|
||
|
public static HashFunction md5() {
|
||
|
return Md5Holder.MD5;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class Md5Holder {
|
||
|
static final HashFunction MD5 = new MessageDigestHashFunction("MD5", "Hashing.md5()");
|
||
|
|
||
|
private Md5Holder() {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Deprecated
|
||
|
public static HashFunction sha1() {
|
||
|
return Sha1Holder.SHA_1;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class Sha1Holder {
|
||
|
static final HashFunction SHA_1 = new MessageDigestHashFunction(McElieceCCA2KeyGenParameterSpec.SHA1, "Hashing.sha1()");
|
||
|
|
||
|
private Sha1Holder() {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static HashFunction sha256() {
|
||
|
return Sha256Holder.SHA_256;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class Sha256Holder {
|
||
|
static final HashFunction SHA_256 = new MessageDigestHashFunction(McElieceCCA2KeyGenParameterSpec.SHA256, "Hashing.sha256()");
|
||
|
|
||
|
private Sha256Holder() {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static HashFunction sha384() {
|
||
|
return Sha384Holder.SHA_384;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class Sha384Holder {
|
||
|
static final HashFunction SHA_384 = new MessageDigestHashFunction(McElieceCCA2KeyGenParameterSpec.SHA384, "Hashing.sha384()");
|
||
|
|
||
|
private Sha384Holder() {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static HashFunction sha512() {
|
||
|
return Sha512Holder.SHA_512;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static class Sha512Holder {
|
||
|
static final HashFunction SHA_512 = new MessageDigestHashFunction(McElieceCCA2KeyGenParameterSpec.SHA512, "Hashing.sha512()");
|
||
|
|
||
|
private Sha512Holder() {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacMd5(Key key) {
|
||
|
return new MacHashFunction("HmacMD5", key, hmacToString("hmacMd5", key));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacMd5(byte[] bArr) {
|
||
|
return hmacMd5(new SecretKeySpec((byte[]) Preconditions.checkNotNull(bArr), "HmacMD5"));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha1(Key key) {
|
||
|
return new MacHashFunction("HmacSHA1", key, hmacToString("hmacSha1", key));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha1(byte[] bArr) {
|
||
|
return hmacSha1(new SecretKeySpec((byte[]) Preconditions.checkNotNull(bArr), "HmacSHA1"));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha256(Key key) {
|
||
|
return new MacHashFunction("HmacSHA256", key, hmacToString("hmacSha256", key));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha256(byte[] bArr) {
|
||
|
return hmacSha256(new SecretKeySpec((byte[]) Preconditions.checkNotNull(bArr), "HmacSHA256"));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha512(Key key) {
|
||
|
return new MacHashFunction("HmacSHA512", key, hmacToString("hmacSha512", key));
|
||
|
}
|
||
|
|
||
|
public static HashFunction hmacSha512(byte[] bArr) {
|
||
|
return hmacSha512(new SecretKeySpec((byte[]) Preconditions.checkNotNull(bArr), "HmacSHA512"));
|
||
|
}
|
||
|
|
||
|
private static String hmacToString(String str, Key key) {
|
||
|
return String.format("Hashing.%s(Key[algorithm=%s, format=%s])", str, key.getAlgorithm(), key.getFormat());
|
||
|
}
|
||
|
|
||
|
public static HashFunction crc32c() {
|
||
|
return Crc32cHashFunction.CRC_32_C;
|
||
|
}
|
||
|
|
||
|
public static HashFunction crc32() {
|
||
|
return ChecksumType.CRC_32.hashFunction;
|
||
|
}
|
||
|
|
||
|
public static HashFunction adler32() {
|
||
|
return ChecksumType.ADLER_32.hashFunction;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
enum ChecksumType implements ImmutableSupplier<Checksum> {
|
||
|
CRC_32("Hashing.crc32()") { // from class: com.google.common.hash.Hashing.ChecksumType.1
|
||
|
@Override // com.google.common.base.Supplier
|
||
|
public final Checksum get() {
|
||
|
return new CRC32();
|
||
|
}
|
||
|
},
|
||
|
ADLER_32("Hashing.adler32()") { // from class: com.google.common.hash.Hashing.ChecksumType.2
|
||
|
@Override // com.google.common.base.Supplier
|
||
|
public final Checksum get() {
|
||
|
return new Adler32();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
public final HashFunction hashFunction;
|
||
|
|
||
|
ChecksumType(String str) {
|
||
|
this.hashFunction = new ChecksumHashFunction(this, 32, str);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static HashFunction farmHashFingerprint64() {
|
||
|
return FarmHashFingerprint64.FARMHASH_FINGERPRINT_64;
|
||
|
}
|
||
|
|
||
|
public static int consistentHash(HashCode hashCode, int i) {
|
||
|
return consistentHash(hashCode.padToLong(), i);
|
||
|
}
|
||
|
|
||
|
public static int consistentHash(long j, int i) {
|
||
|
int i2 = 0;
|
||
|
Preconditions.checkArgument(i > 0, "buckets must be positive: %s", i);
|
||
|
LinearCongruentialGenerator linearCongruentialGenerator = new LinearCongruentialGenerator(j);
|
||
|
while (true) {
|
||
|
int nextDouble = (int) ((i2 + 1) / linearCongruentialGenerator.nextDouble());
|
||
|
if (nextDouble < 0 || nextDouble >= i) {
|
||
|
break;
|
||
|
}
|
||
|
i2 = nextDouble;
|
||
|
}
|
||
|
return i2;
|
||
|
}
|
||
|
|
||
|
public static HashCode combineOrdered(Iterable<HashCode> iterable) {
|
||
|
Iterator<HashCode> it = iterable.iterator();
|
||
|
Preconditions.checkArgument(it.hasNext(), "Must be at least 1 hash code to combine.");
|
||
|
int bits = it.next().bits() / 8;
|
||
|
byte[] bArr = new byte[bits];
|
||
|
Iterator<HashCode> it2 = iterable.iterator();
|
||
|
while (it2.hasNext()) {
|
||
|
byte[] asBytes = it2.next().asBytes();
|
||
|
Preconditions.checkArgument(asBytes.length == bits, "All hashcodes must have the same bit length.");
|
||
|
for (int i = 0; i < asBytes.length; i++) {
|
||
|
bArr[i] = (byte) ((bArr[i] * 37) ^ asBytes[i]);
|
||
|
}
|
||
|
}
|
||
|
return HashCode.fromBytesNoCopy(bArr);
|
||
|
}
|
||
|
|
||
|
public static HashCode combineUnordered(Iterable<HashCode> iterable) {
|
||
|
Iterator<HashCode> it = iterable.iterator();
|
||
|
Preconditions.checkArgument(it.hasNext(), "Must be at least 1 hash code to combine.");
|
||
|
int bits = it.next().bits() / 8;
|
||
|
byte[] bArr = new byte[bits];
|
||
|
Iterator<HashCode> it2 = iterable.iterator();
|
||
|
while (it2.hasNext()) {
|
||
|
byte[] asBytes = it2.next().asBytes();
|
||
|
Preconditions.checkArgument(asBytes.length == bits, "All hashcodes must have the same bit length.");
|
||
|
for (int i = 0; i < asBytes.length; i++) {
|
||
|
bArr[i] = (byte) (bArr[i] + asBytes[i]);
|
||
|
}
|
||
|
}
|
||
|
return HashCode.fromBytesNoCopy(bArr);
|
||
|
}
|
||
|
|
||
|
static int checkPositiveAndMakeMultipleOf32(int i) {
|
||
|
Preconditions.checkArgument(i > 0, "Number of bits must be positive");
|
||
|
return (i + 31) & (-32);
|
||
|
}
|
||
|
|
||
|
public static HashFunction concatenating(HashFunction hashFunction, HashFunction hashFunction2, HashFunction... hashFunctionArr) {
|
||
|
ArrayList arrayList = new ArrayList();
|
||
|
arrayList.add(hashFunction);
|
||
|
arrayList.add(hashFunction2);
|
||
|
arrayList.addAll(Arrays.asList(hashFunctionArr));
|
||
|
return new ConcatenatedHashFunction((HashFunction[]) arrayList.toArray(new HashFunction[0]));
|
||
|
}
|
||
|
|
||
|
public static HashFunction concatenating(Iterable<HashFunction> iterable) {
|
||
|
Preconditions.checkNotNull(iterable);
|
||
|
ArrayList arrayList = new ArrayList();
|
||
|
Iterator<HashFunction> it = iterable.iterator();
|
||
|
while (it.hasNext()) {
|
||
|
arrayList.add(it.next());
|
||
|
}
|
||
|
Preconditions.checkArgument(arrayList.size() > 0, "number of hash functions (%s) must be > 0", arrayList.size());
|
||
|
return new ConcatenatedHashFunction((HashFunction[]) arrayList.toArray(new HashFunction[0]));
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
static final class ConcatenatedHashFunction extends AbstractCompositeHashFunction {
|
||
|
private ConcatenatedHashFunction(HashFunction... hashFunctionArr) {
|
||
|
super(hashFunctionArr);
|
||
|
for (HashFunction hashFunction : hashFunctionArr) {
|
||
|
Preconditions.checkArgument(hashFunction.bits() % 8 == 0, "the number of bits (%s) in hashFunction (%s) must be divisible by 8", hashFunction.bits(), (Object) hashFunction);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.AbstractCompositeHashFunction
|
||
|
final HashCode makeHash(Hasher[] hasherArr) {
|
||
|
byte[] bArr = new byte[bits() / 8];
|
||
|
int i = 0;
|
||
|
for (Hasher hasher : hasherArr) {
|
||
|
HashCode hash = hasher.hash();
|
||
|
i += hash.writeBytesTo(bArr, i, hash.bits() / 8);
|
||
|
}
|
||
|
return HashCode.fromBytesNoCopy(bArr);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.HashFunction
|
||
|
public final int bits() {
|
||
|
int i = 0;
|
||
|
for (HashFunction hashFunction : this.functions) {
|
||
|
i += hashFunction.bits();
|
||
|
}
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
public final boolean equals(Object obj) {
|
||
|
if (obj instanceof ConcatenatedHashFunction) {
|
||
|
return Arrays.equals(this.functions, ((ConcatenatedHashFunction) obj).functions);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public final int hashCode() {
|
||
|
return Arrays.hashCode(this.functions);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
/* loaded from: classes2.dex */
|
||
|
public static final class LinearCongruentialGenerator {
|
||
|
private long state;
|
||
|
|
||
|
public LinearCongruentialGenerator(long j) {
|
||
|
this.state = j;
|
||
|
}
|
||
|
|
||
|
public final double nextDouble() {
|
||
|
this.state = (this.state * 2862933555777941757L) + 1;
|
||
|
return (((int) (r0 >>> 33)) + 1) / 2.147483648E9d;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private Hashing() {
|
||
|
}
|
||
|
}
|