簡體   English   中英

為什么xor運算符會產生“方法無簽名”錯誤消息和/或bitCount()要求可傳遞哪種格式?

[英]Why is the xor operator producing “No signature of method” error message and / or what format does the bitCount() require to be passable?

我一直在嘗試將SQL函數轉換為Groovy,以用於Elastisearch。 但是我對Java和groovy的了解為零,並且我一直在與所有錯誤(由於它們而來)作斗爭。

這里解決了convertFromBaseToBase第一個問題。 但是現在我在XOR運算符上遇到了問題。

很可能在xor部分之后會有更多的問題,所以我將完整的代碼發布在前面:

public static String convertFromBaseToBase (String str, int fromBase, int toBase){
  return (new BigInteger(str, fromBase)).toString(toBase);
}

def ih_comparehash (String hash_1, String hash_2, int maxlen) { 

    String hashpart1;
    String hashpart2;

    int bitcnt = 0
    int strlen = 16
    int len = 0

    len = hash_1.length() / strlen

    for (i = 0; i < len && i < maxlen; i++) {

        hashpart1 = hash_1.substring((i * strlen) + 1, strlen);
        hashpart2 = hash_2.substring((i * strlen) + 1, strlen);

        cfbtb_1 = convertFromBaseToBase(hashpart1, 16, 10);
        cfbtb_2 = convertFromBaseToBase(hashpart2, 16, 10);

        bitcnt = bitcnt + (cfbtb_1 ^ cfbtb_2).bitCount();
    }

    return ((64 * i) - bitcnt) * 100.0 / (64 * i);
}

System.out.print(ih_comparehash("8f8f87878f8f8080", "50b0f878787a9f97", 1));

可在以下網址獲取: https ://groovyconsole.appspot.com/script/5119420292661248

當前錯誤:

groovy.lang.MissingMethodException:方法的無簽名:java.lang.Long.bitCount()適用於參數類型:()值:[]
可能的解決方案:bitCount(long)
在Script1.ih_comparehash(Script1.groovy:31)
在Script1 $ ih_comparehash.callCurrent(未知來源)
在Script1.run(Script1.groovy:40)

如果我完全錯過了某些東西,這是我嘗試轉換為Groovy的SQL函數:

BEGIN
    DECLARE hashpart1 varchar(64) DEFAULT "";
    DECLARE hashpart2 varchar(64) DEFAULT "";
    DECLARE bitcnt int DEFAULT 0;
    DECLARE strlen int DEFAULT 16;
    DECLARE i int DEFAULT 0;
    DECLARE len int DEFAULT 0;

    SET len = LENGTH(hash1) / strlen;

    WHILE i<len AND i < maxlen DO
        SET hashpart1 = SUBSTRING(hash1,(i*strlen)+1,strlen);
        SET hashpart2 = SUBSTRING(hash2,(i*strlen)+1,strlen);
        SET bitcnt = bitcnt + bit_count(cast(conv(hashpart1, 16, 10) as unsigned) ^ cast(conv(hashpart2, 16, 10) as unsigned));
        SET i = i+1;
    END WHILE;

    RETURN ((64*i)-bitcnt)*100.0/(64*i);
END

SQL代碼處理16個十六進制數字的塊,因為這將表達式中使用的數字值的長度限制為64位數字。

然后,它將16位十六進制數字轉換為10進制,因此可以將其轉換為unsigned ,執行XOR並進行位計數。 XOR是二進制運算,因此,如果SQL具有解析十六進制數字的功能,則基數10僅用於強制轉換,實際上並不需要。

在Java中,有一個名為BigInteger的類(您實際上正在使用它),它可以處理任意長度的數字,因此可以像這樣完成所有操作:

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代碼(如果願意)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM