Hanbo Zhang

67 papers A* 8A 5C 1Journal 42Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
Biomed. Signal Process. Control.
Hanbo Zhang, Jincan Zhang, Wenna Chen, Ganqin Du, Qizhi Fu, Hongwei Jiang
2026 J jnl
Knowl. Based Syst.
Hanbo Zhang, Jincan Zhang, Wenna Chen, Ganqin Du
2026 J jnl
CoRR
Qian Long, Yueze Wang, Jiaxi Song, Junbo Zhang, Peiyan Li, Wenxuan Wang, Yuqi Wang, Haoyang Li, Shaoxuan Xie, Guocai Yao, Hanbo Zhang, Xinlong Wang, Zhongyuan Wang, Xuguang Lan, Huaping Liu, Xinghang Li
2025 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Yuqing Lou, Hanbo Zhang, Jun Li, Chen Lin, Leilai Shao, Xiaojun Guo, Yongfu Li, Guoxing Wang, Fakhrul Zaman Rokhani, Jian Zhao
2025 J jnl
IEEE J. Solid State Circuits
Hanbo Zhang, Zhouchen Ma, Yuqing Lou, Yang Bo, Hao Wu, Liang Qi, Yongfu Li, Xiaojun Guo, Guoxing Wang, Jian Zhao
2025 J jnl
CoRR
Wenbo Zhang, Tianrun Hu, Yanyuan Qiao, Hanbo Zhang, Yuchu Qin, Yang Li, Jiajun Liu, Tao Kong, Lingqiao Liu, Xiao Ma
2025 J jnl
Kybernetes
Hanbo Zhang, Yong Qi, Guiyang Zhang
2025 J jnl
CoRR
Chao Tang, Anxing Xiao, Yuhong Deng, Tianrun Hu, Wenlong Dong, Hanbo Zhang, David Hsu, Hong Zhang
2025 J jnl
CoRR
Shiguang Sun, Hanbo Zhang, Zeyang Liu, Xinrui Yang, Lipeng Wan, Bin Yan, Xingyu Chen, Xuguang Lan
2025 J jnl
CoRR
Chao Tang, Anxing Xiao, Yuhong Deng, Tianrun Hu, Wenlong Dong, Hanbo Zhang, David Hsu, Hong Zhang
2025 J jnl
Comput. Mater. Continua
Fangju Zhou, Hanbo Zhang, Na Ye, Jing Huang, Zhu Ren
2025 A* conf
EMNLP
Dong Wang, Xinghang Li, Zhengshen Zhang, Jirong Liu, Xiao Ma, Hanbo Zhang, Tao Kong, Huaping Liu
2025 J jnl
CoRR
Shuhang Xun, Sicheng Tao, Jungang Li, Yibo Shi, Zhixin Lin, Zhanhui Zhu, Yibo Yan, Hanqian Li, Linghao Zhang, Shikang Wang, Yixin Liu, Hanbo Zhang, Ying Ma, Xuming Hu
2025 J jnl
CoRR
Jian Zhang, Hanbo Zhang, Anxing Xiao, David Hsu
2025 J jnl
Kybernetes
Xing Li, Fangyuan Zheng, Yong Qi, Hanbo Zhang
2025 A conf
IROS
Chengzhong Ma, Houxue Yang, Hanbo Zhang, Zeyang Liu, Chao Zhao, Jian Tang, Xuguang Lan, Nanning Zheng
2024 C conf
ISCAS
Hanbo Zhang, Yuqing Lou, Zhihang Zhang, Yongfu Li, Fakhrul Z. Rokhani, Guoxing Wang, Jian Zhao
2024 conf
A-SSCC
Hanbo Zhang, Yuqing Lou, Yang Bo, Zhouchen Ma, Hao Wu, Liang Qi, Yongfu Li, Xiaojun Guo, Guoxing Wang, Jian Zhao
2024 J jnl
CoRR
Chengzhong Ma, Houxue Yang, Hanbo Zhang, Zeyang Liu, Chao Zhao, Jian Tang, Xuguang Lan, Nanning Zheng
2024 J jnl
CoRR
Chilam Cheang, Guangzeng Chen, Ya Jing, Tao Kong, Hang Li, Yifeng Li, Yuxiao Liu, Hongtao Wu, Jiafeng Xu, Yichu Yang, Hanbo Zhang, Minzhao Zhu
2024 conf
CVPR Workshops
Hanbo Zhang, Jie Xu, Yuchen Mo, Tao Kong
2024 J jnl
Neurocomputing
Shiguang Sun, Hanbo Zhang, Zeyang Liu, Xingyu Chen, Xuguang Lan
2024 J jnl
CoRR
Binglei Zhao, Han Wang, Jian Tang, Chengzhong Ma, Hanbo Zhang, Jiayuan Zhang, Xuguang Lan, Xingyu Chen
2024 J jnl
CoRR
Jie Xu, Hanbo Zhang, Xinghang Li, Huaping Liu, Xuguang Lan, Tao Kong
2024 J jnl
IEEE Trans. Engineering Management
Hanbo Zhang, Yong Qi, Guiyang Zhang, Dong Wang
2024 J jnl
CoRR
Xinghang Li, Peiyan Li, Minghuan Liu, Dong Wang, Jirong Liu, Bingyi Kang, Xiao Ma, Tao Kong, Hanbo Zhang, Huaping Liu
2024 A* conf
ICRA
Jie Xu, Hanbo Zhang, Qingyi Si, Yifeng Li, Xuguang Lan, Tao Kong
2024 J jnl
CoRR
Jie Xu, Hanbo Zhang, Qingyi Si, Yifeng Li, Xuguang Lan, Tao Kong
2024 A* conf
ICLR
Xinghang Li, Minghuan Liu, Hanbo Zhang, Cunjun Yu, Jie Xu, Hongtao Wu, Chilam Cheang, Ya Jing, Weinan Zhang, Huaping Liu, Hang Li, Tao Kong
2024 conf
NAACL-HLT
Yan Zeng, Hanbo Zhang, Jiani Zheng, Jiangnan Xia, Guoqiang Wei, Yang Wei, Yuchen Zhang, Tao Kong, Ruihua Song
2023 J jnl
IEEE Access
Hanbo Zhang, Peng Wang, Shen Liang, Tongming Zhou, Wei Wang
2023 J jnl
CoRR
Hanbo Zhang, Jie Xu, Yuchen Mo, Tao Kong
2023 J jnl
J. Comput. Sci. Technol.
Hanbo Zhang, Peng Wang, Mingming Zhang, Wei Wang
2023 A* conf
ICRA
Yuchen Mo, Hanbo Zhang, Tao Kong
2023 A* conf
KDD
Hanbo Zhang, Jiangxin Li, Shen Liang, Peng Wang, Themis Palpanas, Chen Wang, Wei Wang, Haoxuan Zhou, Jianwei Song, Wen Lu
2023 J jnl
CoRR
Xinghang Li, Minghuan Liu, Hanbo Zhang, Cunjun Yu, Jie Xu, Hongtao Wu, Chilam Cheang, Ya Jing, Weinan Zhang, Huaping Liu, Hang Li, Tao Kong
2023 J jnl
CoRR
Yan Zeng, Hanbo Zhang, Jiani Zheng, Jiangnan Xia, Guoqiang Wei, Yang Wei, Yuchen Zhang, Tao Kong
2022 J jnl
IEEE Robotics Autom. Lett.
Hanbo Zhang, Deyu Yang, Han Wang, Binglei Zhao, Xuguang Lan, Jishiyu Ding, Nanning Zheng
2022 J jnl
CoRR
Hanbo Zhang, Jian Tang, Shiguang Sun, Xuguang Lan
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Hanbo Zhang, Xinwen Zhou, Xuguang Lan, Jin Li, Zhiqiang Tian, Nanning Zheng
2021 J jnl
CoRR
Deyu Yang, Hanbo Zhang, Xuguang Lan, Jishiyu Ding
2021 J jnl
World Wide Web
Hanbo Zhang, Peng Wang, Zicheng Fang, Zeyu Wang, Wei Wang
2021 A* conf
IJCAI
Hanbo Zhang, Site Bai, Xuguang Lan, David Hsu, Nanning Zheng
2021 conf
Robotics: Science and Systems
Hanbo Zhang, Yunfan Lu, Cunjun Yu, David Hsu, Xuguang Lan, Nanning Zheng
2021 J jnl
CoRR
Hanbo Zhang, Yunfan Lu, Cunjun Yu, David Hsu, Xuguang Lan, Nanning Zheng
2021 A* conf
ICRA
Binglei Zhao, Hanbo Zhang, Xuguang Lan, Haoyu Wang, Zhiqiang Tian, Nanning Zheng
2021 J jnl
CoRR
Hanbo Zhang, Deyu Yang, Han Wang, Binglei Zhao, Xuguang Lan, Nanning Zheng
2020 A* conf
ICRA
Chenjie Yang, Xuguang Lan, Hanbo Zhang, Nanning Zheng
2020 J jnl
CoRR
Binglei Zhao, Hanbo Zhang, Xuguang Lan, Haoyu Wang, Zhiqiang Tian, Nanning Zheng
2020 conf
HCC
Hanbo Zhang, Shiqing Dou, Yong Xu, Nan Zhang
2020 conf
HCC
Nan Zhang, Yong Xu, Shiqing Dou, Juanli Jing, Hanbo Zhang
2020 J jnl
Pattern Recognit. Lett.
Hanbo Zhang, Xuguang Lan, Xinwen Zhou, Zhiqiang Tian, Yang Zhang, Nanning Zheng
2019 A conf
IROS
Hanbo Zhang, Xuguang Lan, Site Bai, Lipeng Wan, Chenjie Yang, Nanning Zheng
2019 J jnl
CoRR
Hanbo Zhang, Site Bai, Xuguang Lan, Nanning Zheng
2019 A conf
IROS
Hanbo Zhang, Xuguang Lan, Site Bai, Xinwen Zhou, Zhiqiang Tian, Nanning Zheng
2019 A conf
IROS
Chenjie Yang, Xuguang Lan, Hanbo Zhang, Nanning Zheng
2018 J jnl
CoRR
Hanbo Zhang, Xinwen Zhou, Xuguang Lan, Jin Li, Zhiqiang Tian, Nanning Zheng
2018 A conf
IROS
Xinwen Zhou, Xuguang Lan, Hanbo Zhang, Zhiqiang Tian, Yang Zhang, Nanning Zheng
2018 J jnl
CoRR
Xinwen Zhou, Xuguang Lan, Hanbo Zhang, Zhiqiang Tian, Yang Zhang, Nanning Zheng
2018 J jnl
CoRR
Hanbo Zhang, Xuguang Lan, Lipeng Wan, Chenjie Yang, Xinwen Zhou, Nanning Zheng
2018 J jnl
CoRR
Hanbo Zhang, Xuguang Lan, Xinwen Zhou, Nanning Zheng
2018 conf
ROBIO
Chenjie Yang, Xuguang Lan, Hanbo Zhang, Xinwen Zhou, Nanning Zheng
2018 conf
Humanoids
Hanbo Zhang, Xuguang Lan, Xinwen Zhou, Zhiqiang Tian, Yang Zhang, Nanning Zheng
2018 J jnl
CoRR
Hanbo Zhang, Xuguang Lan, Xinwen Zhou, Zhiqiang Tian, Nanning Zheng
2017 conf
BigData Congress
Hanbo Zhang, Yawen Wang, Peng Wang, Wei Wang
2017 conf
ICIRA (1)
Guoqiang Liang, Xuguang Lan, Hanbo Zhang, Xingyu Chen, Nanning Zheng
2012 conf
ICDMA
Jing Huang, Hanwei Chen, Hanbo Zhang
tests/unit/test_decompile_similarity.py
← Index tests/unit/test_decompile_similarity.py python
"""Unit tests for similarity modules:
- bninja/similarity/minhashcustom.py
- bninja/similarity/minhasher.py
"""
import numpy as np
import pytest

from redb.extractors.decompiler.bninja.similarity.minhashcustom import MinHashCustom
from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization


# ============================================================================
# 2a. MinHashCustom
# ============================================================================

class TestMinHashCustomInit:
    def test_init_empty(self):
        mh = MinHashCustom()
        assert not mh.hasMinHash()
        assert mh.minhash == b""
        assert mh.minhash_int == []

    def test_init_from_signature(self):
        sig = [10, 20, 30, 40]
        mh = MinHashCustom(minhash_signature=sig)
        assert mh.hasMinHash()
        assert mh.minhash_int == sig

    def test_init_from_bytes_uint32(self):
        """Verify round-trip: ints -> bytes -> MinHashCustom -> ints."""
        sig = [100, 200, 300]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        # np.frombuffer returns numpy scalars; setMinHash does % 2**32 which
        # overflows numpy uint32, so verify the raw bytes round-trip instead.
        raw_arr = np.frombuffer(packed, dtype=np.uint32)
        assert list(raw_arr) == sig

    def test_init_from_bytes_uint8(self):
        """Verify round-trip: ints -> bytes -> back."""
        sig = [10, 20, 30]
        packed = np.array(sig, dtype=np.uint8).tobytes()
        raw_arr = np.frombuffer(packed, dtype=np.uint8)
        assert list(raw_arr) == sig

    def test_init_both_raises(self):
        sig = [1, 2, 3]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        with pytest.raises(ValueError, match="only one"):
            MinHashCustom(minhash_bytes=packed, minhash_signature=sig)


class TestMinHashCustomSetGet:
    def test_set_and_get_minhash(self):
        mh = MinHashCustom()
        sig = [5, 10, 15]
        mh.setMinHash(sig)
        raw = mh.getMinHash()
        assert raw == np.array(sig, dtype=np.uint32).tobytes()
        assert mh.getMinHashInt() == sig

    def test_minhash_int_truncation(self):
        mh = MinHashCustom(minhash_bits=8)
        # Values > 256 should be truncated mod 2^8
        mh.setMinHash([300, 500, 256])
        for val in mh.minhash_int:
            assert 0 <= val < 256


class TestMinHashCustomHashData:
    def test_hash_data_string(self):
        result = MinHashCustom.hashData("hello", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_bytes(self):
        result = MinHashCustom.hashData(b"bytes", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_list(self):
        result = MinHashCustom.hashData([1, 2, 3], 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_unsupported_type(self):
        with pytest.raises(NotImplementedError, match="Type not supported"):
            MinHashCustom.hashData(123, 42)

    def test_hash_data_deterministic(self):
        assert MinHashCustom.hashData("test", 7) == MinHashCustom.hashData("test", 7)


class TestMinHashCustomScore:
    def test_score_identical(self):
        sig = [1, 2, 3, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig)
        mh2 = MinHashCustom(minhash_signature=sig)
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score == 100.0

    def test_score_different(self):
        mh1 = MinHashCustom(minhash_signature=[1, 2, 3, 4, 5])
        mh2 = MinHashCustom(minhash_signature=[6, 7, 8, 9, 10])
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score < 100.0

    def test_score_against(self):
        sig1 = [1, 2, 3, 4, 5]
        sig2 = [1, 2, 99, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig1)
        mh2 = MinHashCustom(minhash_signature=sig2)
        instance_score = mh1.scoreAgainst(mh2)
        static_score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert instance_score == static_score


class TestMinHashCustomBitModes:
    def test_8bit_mode(self):
        mh = MinHashCustom(minhash_bits=8)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint8)
        assert list(arr) == [10, 20, 30]

    def test_32bit_mode(self):
        mh = MinHashCustom(minhash_bits=32)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint32)
        assert list(arr) == [10, 20, 30]


# ============================================================================
# 2b. MinHasher
# ============================================================================


class MockILNode:
    """Mock IL node with operation and operands for normalization."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockLLILBasicBlock:
    """Mock LLIL basic block that yields IL instructions."""
    def __init__(self, instructions):
        self._instructions = instructions

    def __iter__(self):
        return iter(self._instructions)


class MockLLILFunction:
    """Mock LLIL function with basic blocks."""
    def __init__(self, basic_blocks):
        self.basic_blocks = basic_blocks


# Import MinHasher after we know the module can handle the import
from redb.extractors.decompiler.bninja.similarity.minhasher import (
    MinHasher,
    MINHASH_SIGNATURE_LENGTH,
    MINHASH_SIGNATURE_BITS,
)


class TestMinHasherMakeNgrams:
    def setup_method(self):
        # Create a minimal minhasher with a mock LLIL function
        empty_func = MockLLILFunction([])
        self.hasher = MinHasher(seed=42, il_function=empty_func)

    def test_make_ngrams_basic(self):
        result = self.hasher.make_ngrams(["a", "b", "c", "d"], n=3)
        assert result == [("a", "b", "c"), ("b", "c", "d")]

    def test_make_ngrams_short_input(self):
        result = self.hasher.make_ngrams(["a", "b"], n=3)
        assert result == []

    def test_make_ngrams_exact_n(self):
        result = self.hasher.make_ngrams(["a", "b", "c"], n=3)
        assert result == [("a", "b", "c")]


class TestMinHasherCalculate:
    def _make_llil_function(self, num_instructions=10):
        """Create a mock LLIL function with enough instructions."""
        instructions = [
            MockILNode(operation=i % 20) for i in range(num_instructions)
        ]
        bb = MockLLILBasicBlock(instructions)
        return MockLLILFunction([bb])

    def test_calculate_minhash_empty_function(self):
        # Function with < 3 LLIL instructions -> empty list
        func = self._make_llil_function(num_instructions=2)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert result == []

    def test_calculate_minhash_deterministic(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=42, il_function=func)
        h2 = MinHasher(seed=42, il_function=func)
        assert h1.calculateMinHash() == h2.calculateMinHash()

    def test_calculate_minhash_length(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert len(result) == MINHASH_SIGNATURE_LENGTH

    def test_calculate_minhash_value_range(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        for val in result:
            assert 0 <= val < 2 ** MINHASH_SIGNATURE_BITS

    def test_shingle_hash_deterministic(self):
        func = self._make_llil_function(num_instructions=5)
        hasher = MinHasher(seed=42, il_function=func)
        shingle = ([1, 2], [3, 4], [5, 6])
        assert hasher.shingle_hash(shingle, 99) == hasher.shingle_hash(shingle, 99)

    def test_seed_reproducibility(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=1, il_function=func)
        h2 = MinHasher(seed=2, il_function=func)
        r1 = h1.calculateMinHash()
        r2 = h2.calculateMinHash()
        # Different seeds should (very likely) produce different results
        assert r1 != r2