Xiaohua Qiu

12 papers Journal 5Unranked 7
YearRankTypeTitle / Venue / Authors
2025 conf
MLIC
Qinyu Ren, Zhiming Zhang, Xiaohua Qiu
2024 J jnl
Int. J. Inf. Secur. Priv.
Yashu Liu, Xiaoyi Zhao, Xiaohua Qiu, Han-Bing Yan
2023 J jnl
IET Comput. Vis.
Aitao Yang, Min Li, Zhaoqing Wu, Yujie He, Xiaohua Qiu, Yu Song, Weidong Du, Yao Gou
2021 conf
ICONIP (1)
Zhaoqing Wu, Yancheng Cai, Xiaohua Qiu, Min Li, Yujie He, Yu Song, Weidong Du
2020 J jnl
J. Sensors
Xiaohua Qiu, Min Li, Lin Dong, Guangmang Deng, Liqiong Zhang
2020 J jnl
Traitement du Signal
Liqiong Zhang, Min Li, Xiaohua Qiu, Ying Zhu
2020 conf
ICCPR
Xiaohua Qiu, Min Li, Weidong Du, Hongyan Lu
2019 conf
WISATS (2)
Qian Zhang, Xiaohua Qiu, Xiaorong Zhu
2019 conf
WISATS (2)
Yizhong Wang, Xiaorong Zhu, Xiaohua Qiu
2019 J jnl
Signal Process. Image Commun.
Xiaohua Qiu, Min Li, Liqiong Zhang, Xianjie Yuan
2017 conf
ISSI
Guojun Li, Xiaohua Qiu
2013 conf
ISNN (1)
Yueping Peng, Xinxu Wang, Xiaohua Qiu
redb/extractors/decompiler/bninja/similarity/minhashcustom.py
← Index redb/extractors/decompiler/bninja/similarity/minhashcustom.py python
import numpy as np
import mmh3

class MinHashCustom:
    """
    DTO for an actual MinHash
    <minhash>: a binary sequence of packed int8/32 values
    <minhash_int>: the equivalent representation of <minhash> but as list of int8/32
    """

    _HASH_MAX = 0xFFFFFFFF
    _MINHASH_BITS = 32

    def getSignatureEntrySize(self):
        return 1 if self.MINHASH_BITS <= 8 else 4

    def __init__(self, function_addr=None, minhash_bytes=None, minhash_signature=None, minhash_bits=32):
        self.minhash = b""
        self.minhash_int = []
        if minhash_bits:
            self._MINHASH_BITS = minhash_bits
        if minhash_bytes and minhash_signature:
            raise ValueError("Can use only one keyword argument")
        if minhash_bytes:
            if self._MINHASH_BITS <= 8:
                minhash_signature = np.frombuffer(minhash_bytes, dtype=np.uint8)
            else:
                minhash_signature = np.frombuffer(minhash_bytes, dtype=np.uint32)
            self.setMinHash(minhash_signature)
        elif minhash_signature:
            self.setMinHash(minhash_signature)

        self.shingler_composition = {}
        self.function_addr = function_addr

    def hasMinHash(self):
        return len(self.minhash) > 0

    def getMinHash(self):
        return self.minhash

    def getMinHashInt(self):
        return self.minhash_int

    def setMinHash(self, minhash_signature):
        self.minhash_int = [i % 2 ** self._MINHASH_BITS for i in minhash_signature]
        if self._MINHASH_BITS <= 8:
            self.minhash = np.array(self.minhash_int, dtype=np.uint8).tobytes()
        else:
            self.minhash = np.array(self.minhash_int, dtype=np.uint32).tobytes()

    def getComposition(self):
        return self.shingler_composition

    def scoreAgainst(self, other):
        return self.calculateMinHashScore(self.minhash, other.minhash, minhash_bits=self._MINHASH_BITS)

    @staticmethod
    def getHashMax():
        return MinHashCustom._HASH_MAX

    @staticmethod
    def hashData(data, seed) -> int:
        if isinstance(data, (str, bytes, bytearray)):
            return mmh3.hash(data, seed) & MinHashCustom._HASH_MAX
        elif isinstance(data, (list, tuple)):
            to_hash = "|".join(str(elem) for elem in data)
            return mmh3.hash(to_hash, seed) & MinHashCustom._HASH_MAX
        else:
            raise NotImplementedError(
                f"Type not supported for hashData: {type(data).__name__}"
            )

    @staticmethod
    def calculateMinHashScore(first, second, minhash_bits=32):
        if minhash_bits <= 8:
            first_np = np.frombuffer(first, dtype=np.uint8)
            second_np = np.frombuffer(second, dtype=np.uint8)
        else:
            first_np = np.frombuffer(first, dtype=np.uint32)
            second_np = np.frombuffer(second, dtype=np.uint32)
        return 100.0 * sum(first_np == second_np) / len(first_np)

    @staticmethod
    def calculateMinHashIntScore(first, second):
        score = 0
        num_hashes = len(first)
        if num_hashes:
            for index, part in enumerate(first):
                score += 1 if part == second[index] else 0
            return 100.0 * score / num_hashes
        return 0.0

    @property
    def MINHASH_BITS(self):
        return self._MINHASH_BITS