1 回答

TA貢獻1875條經(jīng)驗 獲得超5個贊
SQL 代碼處理 16 位十六進制數(shù)字的塊,因為這將表達式中使用的數(shù)值的長度限制為 64 位數(shù)字。
然后它將 16 位十六進制數(shù)轉(zhuǎn)換為基數(shù)為 10,因此它可以轉(zhuǎn)換為unsigned,執(zhí)行 XOR 并進行位計數(shù)。XOR 是一個二元運算,因此 base-10 僅用于強制轉(zhuǎn)換,如果 SQL 具有解析十六進制數(shù)的函數(shù),則實際上并不需要。
在 Java 中,有一個名為BigInteger(您實際上正在使用它)的類可以處理任何長度的數(shù)字,因此可以這樣完成:
public double ih_comparehash(String hash_1, String hash_2, int maxlen) {
int len = Math.min(hash_1.length() / 16, maxlen);
BigInteger num1 = new BigInteger(hash_1.substring(0, 16 * len), 16);
BigInteger num2 = new BigInteger(hash_2.substring(0, 16 * len), 16);
int bitcnt = num1.xor(num2).bitCount();
return ((64 * len) - bitcnt) * 100.0 / (64 * len);
}
如果您愿意,也可以使用等效的 Groovy 代碼。
添加回答
舉報