Mads R. Almassalkhi

29 papers C 1Journal 20Unranked 8
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Mazen Elsaadany, Muhammad Hamza Ali, Amritanshu Pandey, Mads R. Almassalkhi
2025 J jnl
CoRR
Mohammad Hassan, Mads R. Almassalkhi
2025 J jnl
CoRR
Yingrui Zhuang, Lin Cheng, Ning Qi, Mads R. Almassalkhi, Feng Liu
2025 J jnl
CoRR
Arash Omidi, Tanmay Mishra, Mads R. Almassalkhi
2025 J jnl
CoRR
Daniel Russell, Dakota Hamilton, Mads R. Almassalkhi, Hamid R. Ossareh
2025 J jnl
IEEE Control. Syst. Lett.
Mazen Elsaadany, Mads R. Almassalkhi, Simon H. Tindemans
2025 J jnl
CoRR
Mazen Elsaadany, Mads R. Almassalkhi, Simon H. Tindemans
2025 J jnl
CoRR
Tanmay Mishra, Dakota Hamilton, Mads R. Almassalkhi
2025 C conf
ACC
Arash Omidi, Tanmay Mishra, Mads R. Almassalkhi
2025 conf
CCTA
Amirhossein Ghorbansarvi, Dakota Hamilton, Mads R. Almassalkhi, Hamid R. Ossareh
2024 J jnl
CoRR
Ning Qi, Pierre Pinson, Mads R. Almassalkhi, Yingrui Zhuang, Yifan Su, Feng Liu
2024 J jnl
CoRR
Waheed Owonikoko, Mazen Elsaadany, Amritanshu Pandey, Mads R. Almassalkhi
2024 J jnl
CoRR
Mazen Elsaadany, Mads R. Almassalkhi
2024 J jnl
CoRR
Arash Omidi, Tanmay Mishra, Mads R. Almassalkhi
2024 J jnl
CoRR
Amirhossein Ghorbansarvi, Dakota Hamilton, Mads R. Almassalkhi, Hamid R. Ossareh
2023 conf
CDC
Mazen Elsaadany, Mads R. Almassalkhi
2023 J jnl
CoRR
Hani Mavalizadeh, Luis A. Duffaut Espinosa, Mads R. Almassalkhi
2022 J jnl
IEEE Trans. Control. Syst. Technol.
Micah Botkin-Levy, Alexander Engelmann, Tillmann Mühlpfordt, Timm Faulwasser, Mads R. Almassalkhi
2022 J jnl
IEEE Trans. Smart Grid
Adil Khurram, Mahraz Amini, Luis A. Duffaut Espinosa, Paul D. H. Hines, Mads R. Almassalkhi
2022 J jnl
CoRR
Sarnaduti Brahma, Hamid R. Ossareh, Mads R. Almassalkhi
2022 conf
CDC
Samuel Chevalier, Mads R. Almassalkhi
2022 J jnl
CoRR
Samuel Chevalier, Mads R. Almassalkhi
2021 conf
CCTA
Sarnaduti Brahma, Mads R. Almassalkhi, Hamid R. Ossareh
2020 conf
CDC
Luis A. Duffaut Espinosa, Adil Khurram, Mads R. Almassalkhi
2020 conf
SmartGridComm
Hani Mavalizadeh, Luis A. Duffaut Espinosa, Mads R. Almassalkhi
2020 J jnl
CoRR
Hani Mavalizadeh, Luis A. Duffaut Espinosa, Mads R. Almassalkhi
2020 J jnl
CoRR
Micah Botkin-Levy, Alexander Engelmann, Tillmann Mühlpfordt, Timm Faulwasser, Mads R. Almassalkhi
2018 conf
CCTA
Sarnaduti Brahma, Mads R. Almassalkhi, Hamid R. Ossareh
2016 conf
PSCC
Mads R. Almassalkhi, Anna Towle
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