Haibo Zhu

12 papers B 1C 2Journal 5Unranked 4
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Digit. Earth
Jing Yang, Haotian Lu, Zaiyang Ma, Yi Lu, Wei Wang, Jie Zhu, Chao Wu, Haibo Zhu, Min Chen, Yizhong Sun
2022 J jnl
IEEE Trans. Instrum. Meas.
Haibo Zhu, Jun Yang, Haoliang Zhang, Zhangjun Yu, Xiaojun Zhang, Yunlong Zhu, Fanyang Dang, Yonggui Yuan, Yuncai Wang, Yuwen Qin
2022 J jnl
Nucleic Acids Res.
Haibo Zhu, Hao Fu, Tianyu Cui, Lin Ning, Huaguo Shao, Yehan Guo, Yanting Ke, Jiayi Zheng, Hongyan Lin, Xin Wu, Guanghao Liu, Jun He, Xin Han, Wenlin Li, Xiaoyang Zhao, Huasong Lu, Dong Wang, Kongfa Hu, Xiaopei Shen
2020 J jnl
IEEE Trans. Instrum. Meas.
Xu Lu, Yonggui Yuan, Chi Ma, Haibo Zhu, Yunlong Zhu, Zhangjun Yu, Xiaojun Zhang, Fuqiang Jiang, Jianzhong Zhang, Hanyang Li, Jun Yang, Libo Yuan
2013 C conf
ISCAS
Haibo Zhu, Houqiang Li
2011 conf
CSEE (3)
Haibo Zhu, Qingxi Hong
2010 B conf
ICIP
Miska M. Hannuksela, Haibo Zhu, Houqiang Li, Moncef Gabbouj
2008 conf
ACIS-ICIS
Haibo Zhu, Ying Zou
2008 J jnl
J. Syst. Archit.
Partha Pratim Pande, Amlan Ganguly, Haibo Zhu, Cristian Grecu
2007 conf
ASAP
Haibo Zhu, Partha Pratim Pande, Cristian Grecu
2006 conf
SoCC
Partha Pratim Pande, Haibo Zhu, Amlan Ganguly, Cristian Grecu
2006 C conf
DSD
Partha Pratim Pande, Haibo Zhu, Amlan Ganguly, Cristian Grecu
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