Kailin Tong

14 papers C 3Journal 4Unranked 7
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Ilhan Skender, Kailin Tong, Selim Solmaz, Daniel Watzenig
2025 J jnl
CoRR
Kailin Tong, Selim Solmaz, Kenan Mujkic, Gottfried Allmer, Bo Leng
2024 C conf
IV
Kailin Tong, Selim Solmaz
2024 C conf
IV
Martin Rudigier, Kailin Tong, Selim Solmaz, Georg Nestlinger
2024 C conf
IV
Kailin Tong, Yuxi Hu, Berin Dikic, Selim Solmaz, Friedrich Fraundorfer, Daniel Watzenig
2024 conf
ROSE
Selim Solmaz, Pamela Innerwinkler, Michal Wójcik, Kailin Tong, Elena Politi, George Dimitrakopoulos, Patrick Purucker, Alfred Höß, Björn W. Schuller, Reiner John
2024 conf
ITSC
Kailin Tong, Berin Dikic, Wenbo Xiao, Martin Steinberger, Martin Horn, Selim Solmaz
2024 J jnl
CoRR
Kailin Tong, Berin Dikic, Wenbo Xiao, Martin Steinberger, Martin Horn, Selim Solmaz
2023 conf
ITSC
Kailin Tong, Selim Solmaz, Martin Horn, Michael Stolz, Daniel Watzenig
2022 conf
ITSC
Kailin Tong, Selim Solmaz, Martin Horn
2022 conf
ICCVE
Martin Rudigier, Selim Solmaz, Georg Nestlinger, Kailin Tong
2020 conf
ITSC
Kailin Tong, Zlatan Ajanovic, Georg Stettinger
2020 J jnl
CoRR
Kailin Tong, Zlatan Ajanovic, Georg Stettinger
2019 conf
ICCVE
Mohamed Berrazouane, Kailin Tong, Selim Solmaz, Martijn Kiers, Jacqueline Erhart
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