Natalia G. Berloff

23 papers Journal 23
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Natalia G. Berloff
2025 J jnl
Nat.
Kirill P. Kalinin, Jannes Gladrow, Jiaqi Chu, James H. Clegg, Daniel Cletheroe, Douglas J. Kelly, Babak Rahmani, Grace Brennan, Burcu Canakci, Fabian Falck, Michael Hansen, Jim Kleewein, Heiner Kremer, Greg O'Shea, Lucinda Pickup, Saravan Rajmohan, Antony I. T. Rowstron, Victor Rühle, Lee Braine, Shrirang Khedekar, Natalia G. Berloff, Christos Gkantsidis, Francesca Parmigiani, Hitesh Ballani
2025 J jnl
CoRR
Natalia G. Berloff
2025 J jnl
CoRR
Jona Nagerl, Natalia G. Berloff
2025 J jnl
CoRR
Richard Zhipeng Wang, Guangyao Li, Silvia Gentilini, Marcello Calvanese Strinati, Claudio Conti, Natalia G. Berloff
2025 J jnl
CoRR
Nikita Stroev, Natalia G. Berloff
2025 J jnl
Nat.
Ali Momeni, Babak Rahmani, Benjamin Scellier, Logan G. Wright, Peter L. McMahon, Clara C. Wanjura, Yuhang Li, Anas Skalli, Natalia G. Berloff, Tatsuhiro Onodera, Ilker Oguz, Francesco Morichetti, Philipp del Hougne, Manuel Le Gallo, Abu Sebastian, Azalia Mirhoseini, Cheng Zhang, Danijela Markovic, Daniel Brunner, Christophe Moser, Sylvain Gigan, Florian Marquardt, Aydogan Ozcan, Julie Grollier, Andrea J. Liu, Demetri Psaltis, Andrea Alù, Romain Fleury
2024 J jnl
CoRR
James S. Cummins, Natalia G. Berloff
2024 J jnl
CoRR
James S. Cummins, Natalia G. Berloff
2024 J jnl
CoRR
Airat Kamaletdinov, Natalia G. Berloff
2024 J jnl
CoRR
Richard Zhipeng Wang, James S. Cummins, Marvin Syed, Nikita Stroev, George Pastras, Jason Sakellariou, Symeon Tsintzos, Alexis Askitopoulos, Daniele Veraldi, Marcello Calvanese Strinati, Silvia Gentilini, Davide Pierangeli, Claudio Conti, Natalia G. Berloff
2024 J jnl
CoRR
Daniele Veraldi, Davide Pierangeli, Silvia Gentilini, Marcello Calvanese Strinati, Jason Sakellariou, James S. Cummins, Airat Kamaletdinov, Marvin Syed, Richard Zhipeng Wang, Natalia G. Berloff, Dimitrios Karanikolopoulos, Pavlos G. Savvidis, Claudio Conti
2024 J jnl
CoRR
Ali Momeni, Babak Rahmani, Benjamin Scellier, Logan G. Wright, Peter L. McMahon, Clara C. Wanjura, Yuhang Li, Anas Skalli, Natalia G. Berloff, Tatsuhiro Onodera, Ilker Oguz, Francesco Morichetti, Philipp del Hougne, Manuel Le Gallo, Abu Sebastian, Azalia Mirhoseini, Cheng Zhang, Danijela Markovic, Daniel Brunner, Christophe Moser, Sylvain Gigan, Florian Marquardt, Aydogan Ozcan, Julie Grollier, Andrea J. Liu, Demetri Psaltis, Andrea Alù, Romain Fleury
2023 J jnl
CoRR
Kirill P. Kalinin, George Mourgias-Alexandris, Hitesh Ballani, Natalia G. Berloff, James H. Clegg, Daniel Cletheroe, Christos Gkantsidis, István Haller, Vassily Lyutsarev, Francesca Parmigiani, Lucinda Pickup, Antony I. T. Rowstron
2023 J jnl
CoRR
Nikita Stroev, Natalia G. Berloff
2022 J jnl
CoRR
Natalia G. Berloff
2021 J jnl
CoRR
Kirill P. Kalinin, Natalia G. Berloff
2021 J jnl
CoRR
Nikita Stroev, Natalia G. Berloff
2020 J jnl
CoRR
Kirill P. Kalinin, Natalia G. Berloff
2020 J jnl
CoRR
Kirill P. Kalinin, Alberto Amo, Jacqueline Bloch, Natalia G. Berloff
2019 J jnl
CoRR
Nikita Stroev, Natalia G. Berloff
2019 J jnl
CoRR
Kirill P. Kalinin, Natalia G. Berloff
2018 J jnl
CoRR
Kirill P. Kalinin, Natalia G. Berloff
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