Haifeng Xiao

11 papers C 2Journal 6Unranked 3
YearRankTypeTitle / Venue / Authors
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Rong Huang, Chen Chen, Genyi Wan, Huan Xie, Jun Xie, Jiong Feng, Haifeng Xiao, Xiaohua Tong
2023 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Shu Su, Lida Fanara, Haifeng Xiao, Ernst Hauber, Jürgen Oberst
2023 J jnl
Remote. Sens.
Jung-Rack Kim, Shih-Yuan Lin, Haifeng Xiao
2022 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Hao Chen, Xuanyu Hu, Philipp Gläser, Haifeng Xiao, Zhen Ye, Hanyue Zhang, Xiaohua Tong, Jürgen Oberst
2022 J jnl
Remote. Sens.
Haifeng Xiao, Alexander Stark, Hao Chen, Jürgen Oberst
2021 conf
NEMS
Luming Wang, Zhimin Zhang, Ningning Luo, Haifeng Xiao, Long Ma, Qingwang Meng
2021 J jnl
IEEE Access
Yuhao Xu, Haifeng Xiao
2018 C conf
IGARSS
Rongxing Li, Haifeng Xiao, Shijie Liu, Da Lv, Xiaohua Tong
2016 C conf
IGARSS
Rongxing Li, Yixiang Tian, Tiantian Feng, Huan Xie, Yang Xu, Haifeng Xiao, Hexia Weng, Da Lv, Xiaohua Tong
2012 conf
RWS
Haifeng Xiao, Yun Q. Shi, Wei Su, John A. Kosinski
2008 conf
DMIN
Haifeng Xiao, Chunhua Chen, Wei Su, John A. Kosinski, Yun Q. Shi
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