Kangfeng Zheng

84 papers A* 2B 1C 1Journal 63Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
Knowl. Based Syst.
Jiaqi Gao, Bin Wu, Kangfeng Zheng, Chunhua Wu
2026 A* conf
AAAI
Jujie Wang, Kangfeng Zheng, Bin Wu, Chunhua Wu, Yulin Yao, Jiaqi Gao, Minjiao Yang
2026 A* conf
AAAI
Yulin Yao, Kangfeng Zheng, Bin Wu, Chunhua Wu, Jujie Wang, Jiaqi Gao, Minjiao Yang, Dan Luo
2025 J jnl
Neurocomputing
Dan Luo, Kangfeng Zheng, Chunhua Wu, Xiujuan Wang, Jvjie Wang
2025 J jnl
J. Exp. Theor. Artif. Intell.
Yudao Sun, Kangfeng Zheng, Juan Yin, Chunhua Wu, Xinxin Niu
2025 J jnl
Neurocomputing
Dan Luo, Kangfeng Zheng, Chunhua Wu, Xiujuan Wang
2025 J jnl
Eng. Appl. Artif. Intell.
Keke Wang, Xiujuan Wang, Kangmiao Chen, Zhengxiang Wang, Kangfeng Zheng
2025 J jnl
Comput. Mater. Continua
Yulin Yao, Kangfeng Zheng, Bin Wu, Chunhua Wu, Jiaqi Gao, Jvjie Wang, Minjiao Yang
2024 J jnl
Neural Networks
Haoyu Wang, Chunhua Wu, Kangfeng Zheng
2024 J jnl
Comput. Mater. Continua
Jiaqi Gao, Kangfeng Zheng, Xiujuan Wang, Chunhua Wu, Bin Wu
2024 J jnl
Sensors
Xiujuan Wang, Kangmiao Chen, Keke Wang, Zhengxiang Wang, Kangfeng Zheng, Jiayue Zhang
2024 J jnl
Knowl. Based Syst.
Xiujuan Wang, Keke Wang, Kangmiao Chen, Zhengxiang Wang, Kangfeng Zheng
2023 J jnl
IEEE Signal Process. Lett.
Minjiao Yang, Kangfeng Zheng, Xiujuan Wang, Yudao Sun, Zhe Chen
2023 J jnl
Comput. Syst. Sci. Eng.
Rundong Yang, Kangfeng Zheng, Xiujuan Wang, Bin Wu, Chunhua Wu
2023 J jnl
Multim. Syst.
Yutong Shi, Xiujuan Wang, Kangfeng Zheng, Siwei Cao
2022 J jnl
J. Inf. Process. Syst.
Yanping Shen, Kangfeng Zheng, Chunhua Wu
2022 conf
ICDIS
Huan Zhang, Rongliang Chen, Kangfeng Zheng, Liang Gu, Xiujuan Wang
2022 J jnl
Comput. Intell. Neurosci.
Rundong Yang, Kangfeng Zheng, Bin Wu, Di Li, Zhe Wang, Xiujuan Wang
2022 J jnl
Sensors
Xiujuan Wang, Yutong Shi, Kangfeng Zheng, Yuyang Zhang, Weijie Hong, Siwei Cao
2021 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Yudao Sun, Chunhua Wu, Kangfeng Zheng, Xinxin Niu
2021 conf
DSIT
Zhe Wang, Kangfeng Zheng, Qingbiao Li, Maonan Wang, Xiujuan Wang
2021 conf
ICCCS
Maonan Wang, Kangfeng Zheng, Xinyi Ning, Yanqing Yang, Xiujuan Wang
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Xu Wang, Xuan Zha, Wei Ni, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2021 J jnl
Image Vis. Comput.
Yudao Sun, Juan Yin, Chunhua Wu, Kangfeng Zheng, Xinxin Niu
2021 J jnl
Sensors
Xiujuan Wang, Yi Sui, Kangfeng Zheng, Yutong Shi, Siwei Cao
2021 J jnl
Sensors
Rundong Yang, Kangfeng Zheng, Bin Wu, Chunhua Wu, Xiujuan Wang
2020 J jnl
KSII Trans. Internet Inf. Syst.
Yanping Shen, Kangfeng Zheng, Chunhua Wu, Yixian Yang
2020 J jnl
IEEE Access
Jinsong Zhang, Kangfeng Zheng, Dongmei Zhang, Bo Yan
2020 J jnl
IEEE Access
Maonan Wang, Kangfeng Zheng, Yanqing Yang, Xiujuan Wang
2020 J jnl
IET Inf. Secur.
Xiujuan Wang, Haoyang Tang, Kangfeng Zheng, Yuanrui Tao
2020 J jnl
Appl. Intell.
Kangfeng Zheng, Xiujuan Wang, Bin Wu, Tong Wu
2020 J jnl
Sensors
Zhe Wang, Bo Yan, Chunhua Wu, Bin Wu, Xiujuan Wang, Kangfeng Zheng
2020 J jnl
CoRR
Qingbiao Li, Chunhua Wu, Kangfeng Zheng, Zhe Wang
2020 J jnl
IEEE Access
Yanqing Yang, Kangfeng Zheng, Bin Wu, Yixian Yang, Xiujuan Wang
2020 J jnl
IEEE Netw.
Daojing He, Qi Qiao, Jiahao Gao, Sammy Chan, Kangfeng Zheng, Nadra Guizani
2020 J jnl
CoRR
Qingbiao Li, Chunhua Wu, Kangfeng Zheng
2020 J jnl
Secur. Commun. Networks
Xiujuan Wang, Qianqian Zheng, Kangfeng Zheng, Tong Wu
2020 J jnl
IEEE Access
Bin Wu, Le Liu, Yanqing Yang, Kangfeng Zheng, Xiujuan Wang
2019 J jnl
Secur. Commun. Networks
Yanping Shen, Kangfeng Zheng, Chunhua Wu, Yixian Yang
2019 J jnl
IEEE Access
Kangfeng Zheng, Tong Wu, Xiujuan Wang, Bin Wu, Chunhua Wu
2019 J jnl
Internet Things
Xu Wang, Guangsheng Yu, Xuan Zha, Wei Ni, Ren Ping Liu, Y. Jay Guo, Kangfeng Zheng, Xinxin Niu
2019 J jnl
KSII Trans. Internet Inf. Syst.
Bin Wu, Le Liu, Zhengge Dai, Xiujuan Wang, Kangfeng Zheng
2019 conf
ICCCS
Xiujuan Wang, Chenxi Zhang, Kangfeng Zheng, Haoyang Tang, Yuanrui Tao
2019 J jnl
IEEE Access
Huan Zhang, Kangfeng Zheng, Xiujuan Wang, Shoushan Luo, Bin Wu
2019 J jnl
Secur. Commun. Networks
Xu Wang, Bo Song, Wei Ni, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2019 J jnl
IEEE Access
Yuhua Wang, Chunhua Wu, Kangfeng Zheng, Xiujuan Wang
2019 J jnl
Sensors
Yanqing Yang, Kangfeng Zheng, Chunhua Wu, Yixian Yang
2019 conf
ICA3PP (1)
Huan Zhang, Kangfeng Zheng, Xiaodan Yan, Shoushan Luo, Bin Wu
2019 J jnl
IEEE Access
Zhe Wang, Chunhua Wu, Kangfeng Zheng, Xinxin Niu, Xiujuan Wang
2019 J jnl
Comput. Commun.
Xu Wang, Xuan Zha, Wei Ni, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2019 J jnl
KSII Trans. Internet Inf. Syst.
Tong Wu, Kangfeng Zheng, Chunhua Wu, Xiujuan Wang
2019 J jnl
Int. J. Bio Inspired Comput.
Tong Wu, Kangfeng Zheng, Guangzhi Xu, Chunhua Wu, Xiujuan Wang
2018 J jnl
Comput. J.
Yanping Shen, Kangfeng Zheng, Chunhua Wu, Mingwu Zhang, Xinxin Niu, Yixian Yang
2018 conf
GLOBECOM Workshops
Xu Wang, Xuan Zha, Yu Gu, Wei Ni, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2018 J jnl
IEEE Access
Yang Zhou, Kangfeng Zheng, Wei Ni, Ren Ping Liu
2018 J jnl
Pattern Recognit.
Kangfeng Zheng, Xiujuan Wang
2018 conf
SecureComm (2)
Yahan Wang, Chunhua Wu, Kangfeng Zheng, Xiujuan Wang
2018 J jnl
IEEE Trans. Inf. Forensics Secur.
Xuan Zha, Wei Ni, Xu Wang, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2017 conf
ISCIT
Xuan Zha, Xu Wang, Wei Ni, Ren Ping Liu, Y. Jay Guo, Xinxin Niu, Kangfeng Zheng
2017 J jnl
IEEE Trans. Inf. Forensics Secur.
Xuan Zha, Wei Ni, Kangfeng Zheng, Ren Ping Liu, Xinxin Niu
2017 J jnl
Secur. Commun. Networks
Yanping Xu, Chunhua Wu, Kangfeng Zheng, Xu Wang, Xinxin Niu, Tianliang Lu
2017 J jnl
KSII Trans. Internet Inf. Syst.
Yanping Xu, Chunhua Wu, Kangfeng Zheng, Xinxin Niu, Tianling Lu
2017 J jnl
Int. J. Distributed Sens. Networks
Yanping Xu, Chunhua Wu, Kangfeng Zheng, Xinxin Niu, Yixian Yang
2017 conf
ISCIT
Yang Zhou, Wei Ni, Kangfeng Zheng, Ren Ping Liu, Yixian Yang
2017 J jnl
Secur. Commun. Networks
Yang Zhou, Wei Ni, Kangfeng Zheng, Ren Ping Liu, Yixian Yang
2017 J jnl
KSII Trans. Internet Inf. Syst.
Yixun Hu, Kangfeng Zheng, Xu Wang, Yixian Yang
2016 B conf
SECON
Xuan Zha, Kangfeng Zheng, Dongmei Zhang
2016 conf
ICC
Xu Wang, Kangfeng Zheng, Xinxin Niu, Bin Wu, Chunhua Wu
2016 J jnl
KSII Trans. Internet Inf. Syst.
Weixin Liu, Kangfeng Zheng, Bin Wu, Chunhua Wu, Xinxin Niu
2016 J jnl
IEEE Trans. Inf. Forensics Secur.
Xu Wang, Wei Ni, Kangfeng Zheng, Ren Ping Liu, Xinxin Niu
2015 J jnl
IET Inf. Secur.
Fangfang Dai, Ying Hu, Kangfeng Zheng, Bin Wu
2015 conf
GLOBECOM Workshops
Xuan Zha, Wei Ni, Ren Ping Liu, Kangfeng Zheng, Xinxin Niu
2015 conf
ICC
Fangfang Dai, Kangfeng Zheng, Shoushan Luo, Bin Wu
2015 J jnl
KSII Trans. Internet Inf. Syst.
Fangfang Dai, Kangfeng Zheng, Bin Wu, Shoushan Luo
2014 J jnl
Int. J. Comput. Intell. Syst.
Guoyuan Lin, Yuyu Bie, Min Lei, Kangfeng Zheng
2012 J jnl
J. Networks
Tianliang Lu, Kangfeng Zheng, Rongrong Fu, Yingqing Liu, Bin Wu, Shize Guo
2012 J jnl
Int. J. Comput. Intell. Syst.
Qian Xiao, Kangfeng Zheng, Shoushan Luo, Xu Cui
2012 J jnl
J. Networks
Rongrong Fu, Kangfeng Zheng, Tianliang Lu, Dongmei Zhang, Yixian Yang
2011 conf
GLOBECOM Workshops
Qian Xiao, Kangfeng Zheng, Shoushan Luo, Yajian Zhou
2011 C conf
VCIP
Hong Di, Kangfeng Zheng, Xinxin Niu, Xin Zhang
2010 conf
MVHI
Jian Gao, Yixian Yang, Kangfeng Zheng, Zhengming Hu
2008 conf
ICYCS
Wei Zhang, Shize Guo, Kangfeng Zheng, Yixian Yang
2008 conf
CIS (1)
Xin-lei Li, Kangfeng Zheng, Yixian Yang
2007 conf
Web Intelligence/IAT Workshops
Bin Wu, Kangfeng Zheng, Yixian Yang
redb/extractors/decompiler/bninja/analysis/cfg_features.py
← Index redb/extractors/decompiler/bninja/analysis/cfg_features.py python
import struct
from collections import deque
from typing import Optional

import blake3
import mmh3


# ---------------------------------------------------------------------------
# Task 1.1: Core Graph Utilities
# ---------------------------------------------------------------------------

def bfs_order(successors: list[list[int]], n: int) -> list[int]:
    """
    BFS traversal from node 0 (entry block), returns node indices in visit order.
    Unreachable nodes appended at the end.
    """
    if n == 0:
        return []

    visited = set()
    order = []
    queue = deque([0])
    visited.add(0)

    while queue:
        idx = queue.popleft()
        order.append(idx)
        for target in successors[idx]:
            if target not in visited:
                visited.add(target)
                queue.append(target)

    # Append unreachable blocks (dead code)
    for i in range(n):
        if i not in visited:
            order.append(i)

    return order


def bfs_max_depth(successors: list[list[int]], n: int) -> int:
    """
    Maximum BFS depth from entry block (node 0).
    Replaces the per-block depth column with a single scalar.
    """
    if n == 0:
        return 0

    depth = {0: 0}
    max_d = 0
    queue = deque([0])

    while queue:
        node = queue.popleft()
        for s in successors[node]:
            if s not in depth:
                depth[s] = depth[node] + 1
                if depth[s] > max_d:
                    max_d = depth[s]
                queue.append(s)

    return max_d


# ---------------------------------------------------------------------------
# Task 1.2: Back-Edge Detection (Iterative DFS)
# ---------------------------------------------------------------------------

def count_back_edges(successors: list[list[int]], n: int) -> int:
    """
    Count natural loops via iterative DFS back-edge detection.
    A back edge is an edge to a GRAY (in-stack) node.

    Iterative to avoid stack overflow on functions with 1000+ blocks
    (common in obfuscated malware, VM dispatchers, unrolled loops).
    """
    if n == 0:
        return 0

    WHITE, GRAY, BLACK = 0, 1, 2
    color = [WHITE] * n
    back_edges = 0

    stack = [(0, iter(successors[0]))]
    color[0] = GRAY

    while stack:
        u, children = stack[-1]
        try:
            v = next(children)
            if color[v] == GRAY:
                back_edges += 1
            elif color[v] == WHITE:
                color[v] = GRAY
                stack.append((v, iter(successors[v])))
        except StopIteration:
            color[u] = BLACK
            stack.pop()

    return back_edges


# ---------------------------------------------------------------------------
# Task 1.3: Topology Hash
# ---------------------------------------------------------------------------

def compute_topology_hash(
    successors: list[list[int]],
    bfs: list[int],
    n: int,
) -> bytes:
    """
    BLAKE3 hash of BFS-ordered canonical adjacency.
    Pure graph shape — ignores all block content.
    Two functions with identical control flow structure produce identical hashes.

    Returns 16 bytes (128-bit).
    """
    if n == 0:
        return b'\x00' * 16

    # Remap: original index -> BFS position
    remap = {original: position for position, original in enumerate(bfs)}

    canonical = bytearray()
    for position in range(n):
        original_idx = bfs[position]
        remapped_succs = sorted(
            remap[s] for s in successors[original_idx] if s in remap
        )
        # Pack: node_index (2 bytes) + num_successors (1 byte) + successor indices (2 bytes each)
        canonical.extend(struct.pack('<HB', position, len(remapped_succs)))
        for s in remapped_succs:
            canonical.extend(struct.pack('<H', s))

    return blake3.blake3(bytes(canonical)).digest(length=16)


# ---------------------------------------------------------------------------
# Task 1.4: MD-Index (Top-Down and Bottom-Up)
# ---------------------------------------------------------------------------

def compute_md_index_topdown(
    successors: list[list[int]],
    predecessors: list[list[int]],
    bfs: list[int],
) -> int:
    """
    BinDiff-style top-down MD-index.
    Hash of (in_degree, out_degree) sequence in BFS order from entry.
    Returns UInt64.
    """
    if not bfs:
        return 0

    degree_bytes = bytearray()
    for idx in bfs:
        in_deg = min(len(predecessors[idx]), 255)
        out_deg = min(len(successors[idx]), 255)
        degree_bytes.extend(struct.pack('<BB', in_deg, out_deg))

    h = blake3.blake3(bytes(degree_bytes)).digest(length=8)
    return struct.unpack('<Q', h)[0]


def compute_md_index_bottomup(
    successors: list[list[int]],
    predecessors: list[list[int]],
    n: int,
) -> int:
    """
    Bottom-up MD-index: BFS from exit blocks (no successors),
    traversing edges in reverse.
    Returns UInt64.
    """
    if n == 0:
        return 0

    exits = [i for i in range(n) if len(successors[i]) == 0]
    if not exits:
        exits = [n - 1]  # Fallback: use last block

    visited = set(exits)
    order = []
    queue = deque(exits)

    while queue:
        idx = queue.popleft()
        order.append(idx)
        for pred in predecessors[idx]:
            if pred not in visited:
                visited.add(pred)
                queue.append(pred)

    # Append unreachable blocks
    for i in range(n):
        if i not in visited:
            order.append(i)

    degree_bytes = bytearray()
    for idx in order:
        in_deg = min(len(predecessors[idx]), 255)
        out_deg = min(len(successors[idx]), 255)
        degree_bytes.extend(struct.pack('<BB', in_deg, out_deg))

    h = blake3.blake3(bytes(degree_bytes)).digest(length=8)
    return struct.unpack('<Q', h)[0]


# ---------------------------------------------------------------------------
# Task 1.5: Prime Product
# ---------------------------------------------------------------------------

# Small primes assigned to LLIL opcode categories.
# Keys are the integer values of binaryninja.LowLevelILOperation enum members.
# We use integer keys so this module doesn't import binaryninja.
#
# Mapping rationale: same operation class -> same prime.
# Using LLIL (not native asm) makes this architecture-independent.
#
# Populated at import time by cfg.py using the real LowLevelILOperation enum values.
# Unknown ops map to prime 1 (identity element) in compute_prime_product().
LLIL_OP_PRIMES: dict[int, int] = {}


def compute_prime_product(llil_operations: list[int]) -> int:
    """
    Product of small primes assigned to each LLIL opcode.
    Position-independent: block reordering doesn't change the result.
    Mod 2^64 for fixed-size storage.

    Args:
        llil_operations: flat list of LLIL operation enum integer values
                         for all instructions in the function.
    Returns:
        UInt64 prime product, or 0 if no instructions.
    """
    if not llil_operations:
        return 0

    product = 1
    for op in llil_operations:
        prime = LLIL_OP_PRIMES.get(op, 1)
        product = (product * prime) % (2**64)

    return product


# ---------------------------------------------------------------------------
# Task 1.6: ACFG Block Features
# ---------------------------------------------------------------------------

# Instruction category indices for ACFG feature vectors
CAT_ARITHMETIC = 0
CAT_LOGIC = 1
CAT_TRANSFER = 2
CAT_CALL = 3
CAT_COMPARISON = 4
CAT_MEMORY = 5
CAT_OTHER = 6

# Maps LLIL operation integer values to category indices.
# Populated at import time by cfg.py using the real LowLevelILOperation enum.
LLIL_OP_CATEGORIES: dict[int, int] = {}


def build_block_features(
    block_llil_ops: list[list[int]],
    successors: list[list[int]],
    n: int,
) -> list[list[int]]:
    """
    Extract Gemini-style ACFG features per block.

    Args:
        block_llil_ops: per-block list of LLIL operation integer values.
                        block_llil_ops[i] is the list of ops for block i.
                        Empty list if LLIL unavailable for that block.
        successors: index-based adjacency list.
        n: number of blocks.

    Returns:
        List of [instr_count, arithmetic, logic, transfer, call, comparison,
                 memory, successor_count] per block. All values capped at 65535.
    """
    features = []
    for i in range(n):
        cats = [0, 0, 0, 0, 0, 0, 0]
        ops = block_llil_ops[i] if i < len(block_llil_ops) else []
        for op in ops:
            cat = LLIL_OP_CATEGORIES.get(op, CAT_OTHER)
            cats[cat] += 1

        instr_count = len(ops)
        features.append([
            min(instr_count, 65535),
            min(cats[CAT_ARITHMETIC], 65535),
            min(cats[CAT_LOGIC], 65535),
            min(cats[CAT_TRANSFER], 65535),
            min(cats[CAT_CALL], 65535),
            min(cats[CAT_COMPARISON], 65535),
            min(cats[CAT_MEMORY], 65535),
            min(len(successors[i]), 65535),
        ])

    return features


# ---------------------------------------------------------------------------
# Task 1.7: CFG Feature TLSH
# ---------------------------------------------------------------------------

def compute_cfg_feature_tlsh(
    bb_features: list[list[int]],
    bfs: list[int],
) -> Optional[str]:
    """
    TLSH hash of BFS-ordered per-block feature vectors.
    Captures both structure (BFS ordering) and instruction distribution.

    Returns TLSH hex string or None if too few bytes for TLSH (< 50).
    """
    import tlsh as _tlsh

    feature_bytes = bytearray()
    for idx in bfs:
        feats = bb_features[idx]
        feature_bytes.extend(struct.pack(
            '<HBBBBBBB',
            min(feats[0], 65535),
            min(feats[1], 255),
            min(feats[2], 255),
            min(feats[3], 255),
            min(feats[4], 255),
            min(feats[5], 255),
            min(feats[6], 255),
            min(feats[7], 255),
        ))

    if len(feature_bytes) < 50:
        return None

    try:
        h = _tlsh.hash(bytes(feature_bytes))
        return h if h and h != 'TNULL' else None
    except Exception:
        return None


# ---------------------------------------------------------------------------
# Task 1.8: WL-MinHash
# ---------------------------------------------------------------------------

# Pre-computed seeds for MinHash permutations.
NUM_WL_MINHASH_PERMS = 128
_WL_MINHASH_SEEDS = list(range(NUM_WL_MINHASH_PERMS))  # Seeds 0..127


def compute_wl_minhash(
    successors: list[list[int]],
    predecessors: list[list[int]],
    bb_features: list[list[int]],
    n: int,
    iterations: int = 3,
) -> list[int]:
    """
    Weisfeiler-Leman MinHash for fuzzy topology similarity.

    Initial labels: mmh3 hash of per-block ACFG feature tuple (content-aware).
    WL refinement: incorporate sorted neighbor labels at each iteration.
    MinHash: 128-permutation signature over shingle set.

    Returns list of 128 uint8 values, or [255]*128 sentinel for empty functions.
    """
    if n == 0:
        return [255] * NUM_WL_MINHASH_PERMS

    # Initial labels: hash of instruction category tuple per block
    labels = []
    for i in range(n):
        feats = bb_features[i] if i < len(bb_features) else [0] * 8
        # mmh3 with seed=0 for initial labels
        label = mmh3.hash(str(tuple(feats)), 0) & 0xFFFFFFFF
        labels.append(label)

    # Collect shingles: (iteration, label) pairs as strings for mmh3
    shingles: set[str] = set()

    # Iteration 0: individual block labels
    for label in labels:
        shingles.add(f"0:{label}")

    # WL iterations: refine labels by neighborhood aggregation
    for iteration in range(1, iterations + 1):
        new_labels = []
        for i in range(n):
            succ_labels = tuple(sorted(labels[s] for s in successors[i]))
            pred_labels = tuple(sorted(labels[p] for p in predecessors[i]))
            composite = f"{labels[i]}|{succ_labels}|{pred_labels}"
            new_label = mmh3.hash(composite, 0) & 0xFFFFFFFF
            new_labels.append(new_label)
            shingles.add(f"{iteration}:{new_label}")
        labels = new_labels

    if not shingles:
        return [255] * NUM_WL_MINHASH_PERMS

    # Compute MinHash signature using mmh3 with different seeds
    shingle_list = list(shingles)
    signature = []
    for seed in _WL_MINHASH_SEEDS:
        min_val = 0xFFFFFFFF
        for s in shingle_list:
            h = mmh3.hash(s, seed) & 0xFFFFFFFF
            if h < min_val:
                min_val = h
        # Compress to uint8 for storage
        signature.append(min_val & 0xFF)

    return signature


# ---------------------------------------------------------------------------
# Task 1.9: Packed Adjacency
# ---------------------------------------------------------------------------

def pack_adjacency(successors: list[list[int]]) -> list[int]:
    """
    Pack CFG edges as Array(UInt32).
    Each UInt32 = (source_index << 16) | target_index.
    Supports up to 65,535 blocks per function.
    """
    edges = []
    for src, targets in enumerate(successors):
        for tgt in targets:
            if src < 65536 and tgt < 65536:
                edges.append((src << 16) | tgt)
    return edges