Isaac Lera

55 papers B 3C 2Misc 2Journal 33Unranked 14
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2025 B conf
KES
Achraf Wali, Isaac Lera, Lamia Hadrich Belguith, Antoni Jaume-i-Capó
2025 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
CoRR
Sebastià Sansó, Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
CoRR
Isaac Lera, Carlos Guerrero, Carlos Juiz
2024 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
Future Gener. Comput. Syst.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
J. Supercomput.
Isaac Lera, Carlos Guerrero
2024 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2024 J jnl
Expert Syst. Appl.
Francisco Talavera, Isaac Lera, Carlos Juiz, Carlos Guerrero
2024 J jnl
CoRR
Carlos Guerrero, Antoni Jaume-i-Capó, Carlos Juiz, Isaac Lera
2023 Misc conf
UCC
Sergi Vivó, Isaac Lera, Carlos Guerrero
2022 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Francisco Talavera, Isaac Lera, Carlos Guerrero
2022 J jnl
CoRR
Francisco Talavera, Isaac Lera, Carlos Juiz, Carlos Guerrero
2022 J jnl
Swarm Evol. Comput.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2022 J jnl
J. Softw. Evol. Process.
Stefano Forti, Isaac Lera, Carlos Guerrero, Antonio Brogi
2021 J jnl
J. Grid Comput.
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2021 J jnl
CoRR
Carlos Guerrero, Isaac Lera, Carlos Juiz
2020 J jnl
Softw. Pract. Exp.
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2020 J jnl
Concurr. Comput. Pract. Exp.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2020 conf
ISSRE Workshops
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2019 J jnl
J. Ambient Intell. Humaniz. Comput.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2019 conf
FMEC
Isaac Lera, Carlos Guerrero, Carlos Juiz
2019 J jnl
IEEE Internet Things J.
Isaac Lera, Carlos Guerrero, Carlos Juiz
2019 J jnl
Future Gener. Comput. Syst.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2019 J jnl
CoRR
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2019 conf
EDGE
Antonio Brogi, Stefano Forti, Carlos Guerrero, Isaac Lera
2019 J jnl
IEEE Access
Isaac Lera, Carlos Guerrero, Carlos Juiz
2019 J jnl
CoRR
Isaac Lera, Carlos Guerrero, Carlos Juiz
2018 conf
FMEC
Isaac Lera, Carlos Guerrero, Carlos Juiz
2018 J jnl
J. Grid Comput.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2018 J jnl
J. Grid Comput.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2018 J jnl
IEEE Trans. Parallel Distributed Syst.
Carlos Guerrero, Isaac Lera, Belén Bermejo, Carlos Juiz
2018 conf
FiCloud
Carlos Guerrero, Isaac Lera, Carlos Juiz
2018 J jnl
J. Supercomput.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2016 conf
ANT/SEIT
Belén Bermejo, Carlos Guerrero, Isaac Lera, Carlos Juiz
2014 conf
WWW (Companion Volume)
Isaac Lera, Carlos Guerrero, Carlos Juiz
2013 J jnl
J. Syst. Softw.
Carlos Guerrero, Isaac Lera, Carlos Juiz
2012
Isaac Lera
2012 C conf
KEOD
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2010 Misc conf
CISIS
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2010 conf
WOSP/SIPEW
Isaac Lera, Ramón Puigjaner
2010 C conf
KEOD
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2009 B conf
ACII
Diana Arellano, Isaac Lera, Javier Varona, Francisco José Perales López
2008 conf
SWWS
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2007 conf
Software Engineering Research and Practice
Mehdi Khouja, Carlos Juiz, Isaac Lera, Ramón Puigjaner, Farouk Kamoun
2007 J jnl
Softw. Qual. J.
Isaac Lera, Pere P. Sancho, Carlos Juiz, Ramón Puigjaner, Joachim Zottl, Günter Haring
2006 conf
ISPA Workshops
Borja Miñano, Isaac Lera, Pere P. Sancho, Carlos Juiz, Ramón Puigjaner
2006 conf
Software Engineering Research and Practice
Ramón Puigjaner, Carlos Juiz, Pere P. Sancho, Isaac Lera, Borja Miñano
2006 conf
AINA (1)
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2006 J jnl
Sci. Comput. Program.
Isaac Lera, Carlos Juiz, Ramón Puigjaner
2005 conf
WOSP
Isaac Lera, Carlos Juiz, Ramón Puigjaner, Christian Kurz, Günter Haring, Joachim Zottl
2005 B conf
ICWE
Isaac Lera, Carlos Juiz, Ramón Puigjaner
redb/extractors/decompiler/bninja/similarity/minhasher.py
← Index redb/extractors/decompiler/bninja/similarity/minhasher.py python
import logging
import random
from enum import Enum

from ..analysis.medium_level_normalization import MediumLevelNormalization

try:
    from .minhashcustom import MinHashCustom
    from ..analysis.low_level_normalization import LowLevelNormalization
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.similarity.minhashcustom import MinHashCustom
    from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization

## Values for this configuration were extracted from https://github.com/danielplohmann/mcrit/blob/main/mcrit/config/MinHashConfig.py#L10
# Length in number of Shingles of which a minhash consists
# this value represents the length of sha256sum hash truncated
MINHASH_SIGNATURE_LENGTH: int = 64
# Number of bits per signature element (1-32 bits)
MINHASH_SIGNATURE_BITS: int = 8


class TokenKind(Enum):
    LLIL = "llil"
    TYPED_LLIL = "typed_llil"
    MLIL = "mlil"
    TYPED_MLIL = "typed_mlil"


class MinHasher:
    # stick to the default method
    MINHASH_STRATEGY_HASH_ALL = 1

    def __init__(self, seed, il_function, kind: TokenKind = TokenKind.LLIL):
        self._minhash_seeds = []
        self.il_func = il_function
        self.kind = kind
        self._minhash_permutation = []
        self._signature_segments = []
        self._initMinhashing(seed)

    def _initMinhashing(self, MINHASH_SEED=None):
        random.seed(MINHASH_SEED)
        # init sequence of seeds
        self._minhash_seeds = [
            random.randint(0, MinHashCustom.getHashMax()) for _ in range(MINHASH_SIGNATURE_LENGTH)
        ]

    def make_ngrams(self, tokens, n=3):
        """Take the ngrams of the IL we try to pass into the functions"""
        return [tuple(tokens[i:i+n]) for i in range(len(tokens) - n + 1)]

    def _extract_tokens(self):
        """Extract the IL tokens from the IL function, picking the right
        normalizer (LLIL/MLIL) and the right normalization mode
        (skeleton/typed) based on self.kind."""
        if self.kind in (TokenKind.LLIL, TokenKind.TYPED_LLIL):
            normalizer = LowLevelNormalization()
        elif self.kind in (TokenKind.MLIL, TokenKind.TYPED_MLIL):
            normalizer = MediumLevelNormalization()
        else:
            raise ValueError(f"Unsupported token kind: {self.kind}")

        # typed variants include operand type info, skeleton variants don't
        if self.kind in (TokenKind.TYPED_LLIL, TokenKind.TYPED_MLIL):
            normalize = normalizer.normalize_instr_with_operands
        else:
            normalize = normalizer.normalize_instruction_all_levels

        instructions = []
        for basic_block in self.il_func.basic_blocks:
            for il in basic_block:
                instructions.append(normalize(il))

        return instructions

    def calculateMinHash(self):
        """Calculate hash function every time, then take minimum shingle per shingler"""
        minhash_result = MinHashCustom(minhash_bits=MINHASH_SIGNATURE_BITS)
        minhash_signature = []

        tokens = self._extract_tokens()
        shingles = self.make_ngrams(tokens, n=3)

        # Functions with fewer than 3 IL instructions can't produce n-grams
        # Return empty minhash for such small functions (thunks, stubs, etc.)
        # Triggered by 39d8ad95b0323c37bd3134ab93ac4af44c66a1a8443a41c1ac02cec19bb2816a
        if not shingles:
            return []

        # Generate the MinHash
        for seed in self._minhash_seeds:
            hashed_shingles = [
                self.shingle_hash(shingle, seed) for shingle in shingles
            ]
            min_value = min(hashed_shingles)

            if MINHASH_SIGNATURE_BITS < 32:
                min_value %= (2 ** MINHASH_SIGNATURE_BITS)

            minhash_signature.append(min_value)

        minhash_result.setMinHash(minhash_signature)
        return minhash_result.getMinHashInt()

    def shingle_hash(self, shingle, hash_seed=0):
        """Produce a single 32bit UINT hash for a given shingle"""
        return MinHashCustom.hashData(shingle, hash_seed)