Ran Gelles

103 papers A* 13A 11B 7Misc 2Journal 63Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
Distributed Comput.
Fabian Frei, Ran Gelles, Ahmed Ghazy, Alexandre Nolin
2025 J jnl
IACR Cryptol. ePrint Arch.
Ran Gelles, Carmit Hazay, Manuj Mukherjee, Jaspal Singh, Arun Yeragudipati, Vassilis Zikas
2025 J jnl
CoRR
Ittay Alfassi, Ran Gelles, Rotem Liss, Tal Mor
2025 conf
CRYPTO (2)
Ran Gelles, Christoph Lenzen, Julian Loss, Sravya Yandamuri
2025 J jnl
IACR Cryptol. ePrint Arch.
Ran Gelles, Christoph Lenzen, Julian Loss, Sravya Yandamuri
2025 A conf
DISC
Keren Censor-Hillel, Orr Fischer, Ran Gelles, Pedro Soto
2025 J jnl
CoRR
Keren Censor-Hillel, Orr Fischer, Ran Gelles, Pedro Soto
2024 A* conf
PODC
Fabian Frei, Ran Gelles, Ahmed Ghazy, Alexandre Nolin
2024 A conf
DISC
Timothé Albouy, Davide Frey, Ran Gelles, Carmit Hazay, Michel Raynal, Elad Michael Schiller, François Taïani, Vassilis Zikas
2024 B conf
ISIT
Manuj Mukherjee, Ran Gelles
2024 A conf
DISC
Fabian Frei, Ran Gelles, Ahmed Ghazy, Alexandre Nolin
2024 J jnl
CoRR
Fabian Frei, Ran Gelles, Ahmed Ghazy, Alexandre Nolin
2024 B conf
ISIT
Manuj Mukherjee, Ran Gelles
2024 A conf
APPROX/RANDOM
Eden Fargion, Ran Gelles, Meghal Gupta
2024 J jnl
CoRR
Eden Fargion, Ran Gelles, Meghal Gupta
2024 B conf
OPODIS
Timothé Albouy, Davide Frey, Ran Gelles, Carmit Hazay, Michel Raynal, Elad Michael Schiller, François Taïani, Vassilis Zikas
2024 A* ed.
PODC
Ran Gelles, Dennis Olivetti, Petr Kuznetsov
2024 A conf
DISC
Ran Gelles, Zvi Lotker, Frederik Mallmann-Trenn
2024 J jnl
CoRR
Ran Gelles, Zvi Lotker, Frederik Mallmann-Trenn
2024 J jnl
J. Appl. Comput. Topol.
Pierre Fraigniaud, Ran Gelles, Zvi Lotker
2023 A conf
ITCS
Fabien Dufoulon, Yuval Emek, Ran Gelles
2023 J jnl
Distributed Comput.
Keren Censor-Hillel, Shir Cohen, Ran Gelles, Gal Sela
2023 J jnl
Distributed Comput.
Keren Censor-Hillel, Shir Cohen, Ran Gelles, Gal Sela
2023 J jnl
CoRR
Timothé Albouy, Davide Frey, Ran Gelles, Carmit Hazay, Michel Raynal, Elad Michael Schiller, François Taïani, Vassilis Zikas
2022 J jnl
CoRR
Fabien Dufoulon, Yuval Emek, Ran Gelles
2022 A* conf
PODC
Keren Censor-Hillel, Shir Cohen, Ran Gelles, Gal Sela
2022 J jnl
CoRR
Keren Censor-Hillel, Shir Cohen, Ran Gelles, Gal Sela
2022 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Yael Tauman Kalai, Govind Ramnarayan
2022 J jnl
Inf. Comput.
Yagel Ashkenazi, Ran Gelles, Amir Leshem
2022 J jnl
J. ACM
Mark Braverman, Klim Efremenko, Ran Gelles, Michael A. Yitayew
2021 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Yael Tauman Kalai, Govind Ramnarayan
2021 J jnl
IEEE J. Sel. Areas Inf. Theory
Manuj Mukherjee, Ran Gelles
2021 J jnl
CoRR
Manuj Mukherjee, Ran Gelles
2021 B conf
ITW
Manuj Mukherjee, Ran Gelles
2021 A* conf
PODC
Pierre Fraigniaud, Ran Gelles, Zvi Lotker
2021 J jnl
CoRR
Pierre Fraigniaud, Ran Gelles, Zvi Lotker
2020 A* conf
PODC
Yagel Ashkenazi, Ran Gelles, Amir Leshem
2020 J jnl
SIAM J. Discret. Math.
Ran Gelles, Rafail Ostrovsky, Alan Roytman
2019 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Yael Tauman Kalai
2019 J jnl
CoRR
Ran Gelles, Yael Tauman Kalai, Govind Ramnarayan
2019 A* conf
PODC
Ran Gelles, Yael Tauman Kalai, Govind Ramnarayan
2019 B conf
OPODIS
Ran Gelles, Siddharth Iyer
2019 J jnl
Distributed Comput.
Keren Censor-Hillel, Ran Gelles, Bernhard Haeupler
2019 J jnl
CoRR
Yagel Ashkenazi, Ran Gelles, Amir Leshem
2019 A conf
CCC
Mark Braverman, Klim Efremenko, Ran Gelles, Michael A. Yitayew
2019 J jnl
Distributed Comput.
Noga Alon, Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2018 J jnl
J. ACM
Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2018 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Bernhard Haeupler, Gillat Kol, Noga Ron-Zewi, Avi Wigderson
2018 J jnl
CoRR
Ran Gelles, Siddharth Iyer
2018 A conf
ITCS
Keren Censor-Hillel, Ran Gelles, Bernhard Haeupler
2018 J jnl
CoRR
Mark Braverman, Klim Efremenko, Ran Gelles, Michael A. Yitayew
2018 Misc conf
SCN
Ran Gelles, Anat Paskin-Cherniavsky, Vassilis Zikas
2018 J jnl
IACR Cryptol. ePrint Arch.
Ran Gelles, Anat Paskin-Cherniavsky, Vassilis Zikas
2017 J jnl
SIAM J. Comput.
Ran Gelles, Bernhard Haeupler
2017 J jnl
IEEE Trans. Inf. Theory
Mark Braverman, Ran Gelles, Jieming Mao, Rafail Ostrovsky
2017 J jnl
Found. Trends Theor. Comput. Sci.
Ran Gelles
2017 A conf
ITCS
Ran Gelles, Yael Tauman Kalai
2017 J jnl
Electron. Colloquium Comput. Complex.
Ran Gelles, Yael Tauman Kalai
2017 J jnl
CoRR
Keren Censor-Hillel, Ran Gelles, Bernhard Haeupler
2016 B conf
ISIT
Shweta Agrawal, Ran Gelles, Amit Sahai
2016 A* conf
ICALP
Mark Braverman, Ran Gelles, Jieming Mao, Rafail Ostrovsky
2016 A* conf
STOC
Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2016 J jnl
IEEE Trans. Inf. Theory
Klim Efremenko, Ran Gelles, Bernhard Haeupler
2016 J jnl
Electron. Colloquium Comput. Complex.
Mark Braverman, Ran Gelles, Michael A. Yitayew
2016 A* conf
PODC
Noga Alon, Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2016 A* conf
SODA
Ran Gelles, Bernhard Haeupler, Gillat Kol, Noga Ron-Zewi, Avi Wigderson
2015 conf
TCC (1)
Juan A. Garay, Ran Gelles, David S. Johnson, Aggelos Kiayias, Moti Yung
2015 A* conf
SODA
Ran Gelles, Bernhard Haeupler
2015 J jnl
CoRR
Mark Braverman, Ran Gelles, Jieming Mao, Rafail Ostrovsky
2015 J jnl
Electron. Colloquium Comput. Complex.
Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2015 A conf
ITCS
Klim Efremenko, Ran Gelles, Bernhard Haeupler
2015 J jnl
CoRR
Klim Efremenko, Ran Gelles, Bernhard Haeupler
2015 J jnl
IEEE Trans. Inf. Theory
Matthew K. Franklin, Ran Gelles, Rafail Ostrovsky, Leonard J. Schulman
2015 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Amit Sahai, Akshay Wadia
2015 J jnl
Electron. Colloquium Comput. Complex.
Noga Alon, Mark Braverman, Klim Efremenko, Ran Gelles, Bernhard Haeupler
2015 J jnl
Electron. Colloquium Comput. Complex.
Ran Gelles, Bernhard Haeupler, Gillat Kol, Noga Ron-Zewi, Avi Wigderson
2014 J jnl
IACR Cryptol. ePrint Arch.
Juan A. Garay, Ran Gelles, David S. Johnson, Aggelos Kiayias, Moti Yung
2014 J jnl
IEEE Trans. Inf. Theory
Ran Gelles, Ankur Moitra, Amit Sahai
2014 B conf
SOFSEM
Ran Gelles, Rafail Ostrovsky, Alan Roytman
2014 J jnl
Theor. Comput. Sci.
Vladimir Braverman, Ran Gelles, Rafail Ostrovsky
2014
Ran Gelles
2014 J jnl
SIAM J. Comput.
Harry Buhrman, Nishanth Chandran, Serge Fehr, Ran Gelles, Vipul Goyal, Rafail Ostrovsky, Christian Schaffner
2014 A conf
ITCS
Ran Gelles, Amit Sahai, Akshay Wadia
2013 J jnl
CoRR
Shweta Agrawal, Ran Gelles, Amit Sahai
2013 J jnl
CoRR
Michel Boyer, Ran Gelles, Tal Mor
2013 Misc conf
COCOON
Vladimir Braverman, Ran Gelles, Rafail Ostrovsky
2013 conf
CRYPTO (2)
Matthew K. Franklin, Ran Gelles, Rafail Ostrovsky, Leonard J. Schulman
2013 J jnl
IACR Cryptol. ePrint Arch.
Ran Gelles, Amit Sahai, Akshay Wadia
2012 conf
TPNC
Michel Boyer, Ran Gelles, Tal Mor
2012 conf
ICALP (2)
Ran Gelles, Rafail Ostrovsky, Kina Winoto
2012 J jnl
IACR Cryptol. ePrint Arch.
Ran Gelles, Rafail Ostrovsky, Kina Winoto
2012 conf
TPNC
Ran Gelles, Tal Mor
2012 J jnl
Electron. Colloquium Comput. Complex.
Matthew K. Franklin, Ran Gelles, Rafail Ostrovsky, Leonard J. Schulman
2011 A* conf
FOCS
Ran Gelles, Ankur Moitra, Amit Sahai
2011 J jnl
CoRR
Ran Gelles, Tal Mor
2011 A* conf
CRYPTO
Harry Buhrman, Nishanth Chandran, Serge Fehr, Ran Gelles, Vipul Goyal, Rafail Ostrovsky, Christian Schaffner
2011 J jnl
CoRR
Ran Gelles, Amit Sahai
2011 J jnl
CoRR
Serge Fehr, Ran Gelles, Christian Schaffner
2010 J jnl
CoRR
Vladimir Braverman, Ran Gelles, Rafail Ostrovsky
2010 J jnl
CoRR
Harry Buhrman, Nishanth Chandran, Serge Fehr, Ran Gelles, Vipul Goyal, Rafail Ostrovsky, Christian Schaffner
2010 J jnl
IACR Cryptol. ePrint Arch.
Harry Buhrman, Nishanth Chandran, Serge Fehr, Ran Gelles, Vipul Goyal, Rafail Ostrovsky, Christian Schaffner
2009 J jnl
Algorithms
Michel Boyer, Ran Gelles, Tal Mor
2008 J jnl
CoRR
Michel Boyer, Ran Gelles, Dan Kenigsberg, Tal Mor
tests/unit/test_decompile_similarity.py
← Index tests/unit/test_decompile_similarity.py python
"""Unit tests for similarity modules:
- bninja/similarity/minhashcustom.py
- bninja/similarity/minhasher.py
"""
import numpy as np
import pytest

from redb.extractors.decompiler.bninja.similarity.minhashcustom import MinHashCustom
from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization


# ============================================================================
# 2a. MinHashCustom
# ============================================================================

class TestMinHashCustomInit:
    def test_init_empty(self):
        mh = MinHashCustom()
        assert not mh.hasMinHash()
        assert mh.minhash == b""
        assert mh.minhash_int == []

    def test_init_from_signature(self):
        sig = [10, 20, 30, 40]
        mh = MinHashCustom(minhash_signature=sig)
        assert mh.hasMinHash()
        assert mh.minhash_int == sig

    def test_init_from_bytes_uint32(self):
        """Verify round-trip: ints -> bytes -> MinHashCustom -> ints."""
        sig = [100, 200, 300]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        # np.frombuffer returns numpy scalars; setMinHash does % 2**32 which
        # overflows numpy uint32, so verify the raw bytes round-trip instead.
        raw_arr = np.frombuffer(packed, dtype=np.uint32)
        assert list(raw_arr) == sig

    def test_init_from_bytes_uint8(self):
        """Verify round-trip: ints -> bytes -> back."""
        sig = [10, 20, 30]
        packed = np.array(sig, dtype=np.uint8).tobytes()
        raw_arr = np.frombuffer(packed, dtype=np.uint8)
        assert list(raw_arr) == sig

    def test_init_both_raises(self):
        sig = [1, 2, 3]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        with pytest.raises(ValueError, match="only one"):
            MinHashCustom(minhash_bytes=packed, minhash_signature=sig)


class TestMinHashCustomSetGet:
    def test_set_and_get_minhash(self):
        mh = MinHashCustom()
        sig = [5, 10, 15]
        mh.setMinHash(sig)
        raw = mh.getMinHash()
        assert raw == np.array(sig, dtype=np.uint32).tobytes()
        assert mh.getMinHashInt() == sig

    def test_minhash_int_truncation(self):
        mh = MinHashCustom(minhash_bits=8)
        # Values > 256 should be truncated mod 2^8
        mh.setMinHash([300, 500, 256])
        for val in mh.minhash_int:
            assert 0 <= val < 256


class TestMinHashCustomHashData:
    def test_hash_data_string(self):
        result = MinHashCustom.hashData("hello", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_bytes(self):
        result = MinHashCustom.hashData(b"bytes", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_list(self):
        result = MinHashCustom.hashData([1, 2, 3], 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_unsupported_type(self):
        with pytest.raises(NotImplementedError, match="Type not supported"):
            MinHashCustom.hashData(123, 42)

    def test_hash_data_deterministic(self):
        assert MinHashCustom.hashData("test", 7) == MinHashCustom.hashData("test", 7)


class TestMinHashCustomScore:
    def test_score_identical(self):
        sig = [1, 2, 3, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig)
        mh2 = MinHashCustom(minhash_signature=sig)
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score == 100.0

    def test_score_different(self):
        mh1 = MinHashCustom(minhash_signature=[1, 2, 3, 4, 5])
        mh2 = MinHashCustom(minhash_signature=[6, 7, 8, 9, 10])
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score < 100.0

    def test_score_against(self):
        sig1 = [1, 2, 3, 4, 5]
        sig2 = [1, 2, 99, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig1)
        mh2 = MinHashCustom(minhash_signature=sig2)
        instance_score = mh1.scoreAgainst(mh2)
        static_score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert instance_score == static_score


class TestMinHashCustomBitModes:
    def test_8bit_mode(self):
        mh = MinHashCustom(minhash_bits=8)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint8)
        assert list(arr) == [10, 20, 30]

    def test_32bit_mode(self):
        mh = MinHashCustom(minhash_bits=32)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint32)
        assert list(arr) == [10, 20, 30]


# ============================================================================
# 2b. MinHasher
# ============================================================================


class MockILNode:
    """Mock IL node with operation and operands for normalization."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockLLILBasicBlock:
    """Mock LLIL basic block that yields IL instructions."""
    def __init__(self, instructions):
        self._instructions = instructions

    def __iter__(self):
        return iter(self._instructions)


class MockLLILFunction:
    """Mock LLIL function with basic blocks."""
    def __init__(self, basic_blocks):
        self.basic_blocks = basic_blocks


# Import MinHasher after we know the module can handle the import
from redb.extractors.decompiler.bninja.similarity.minhasher import (
    MinHasher,
    MINHASH_SIGNATURE_LENGTH,
    MINHASH_SIGNATURE_BITS,
)


class TestMinHasherMakeNgrams:
    def setup_method(self):
        # Create a minimal minhasher with a mock LLIL function
        empty_func = MockLLILFunction([])
        self.hasher = MinHasher(seed=42, il_function=empty_func)

    def test_make_ngrams_basic(self):
        result = self.hasher.make_ngrams(["a", "b", "c", "d"], n=3)
        assert result == [("a", "b", "c"), ("b", "c", "d")]

    def test_make_ngrams_short_input(self):
        result = self.hasher.make_ngrams(["a", "b"], n=3)
        assert result == []

    def test_make_ngrams_exact_n(self):
        result = self.hasher.make_ngrams(["a", "b", "c"], n=3)
        assert result == [("a", "b", "c")]


class TestMinHasherCalculate:
    def _make_llil_function(self, num_instructions=10):
        """Create a mock LLIL function with enough instructions."""
        instructions = [
            MockILNode(operation=i % 20) for i in range(num_instructions)
        ]
        bb = MockLLILBasicBlock(instructions)
        return MockLLILFunction([bb])

    def test_calculate_minhash_empty_function(self):
        # Function with < 3 LLIL instructions -> empty list
        func = self._make_llil_function(num_instructions=2)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert result == []

    def test_calculate_minhash_deterministic(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=42, il_function=func)
        h2 = MinHasher(seed=42, il_function=func)
        assert h1.calculateMinHash() == h2.calculateMinHash()

    def test_calculate_minhash_length(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert len(result) == MINHASH_SIGNATURE_LENGTH

    def test_calculate_minhash_value_range(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        for val in result:
            assert 0 <= val < 2 ** MINHASH_SIGNATURE_BITS

    def test_shingle_hash_deterministic(self):
        func = self._make_llil_function(num_instructions=5)
        hasher = MinHasher(seed=42, il_function=func)
        shingle = ([1, 2], [3, 4], [5, 6])
        assert hasher.shingle_hash(shingle, 99) == hasher.shingle_hash(shingle, 99)

    def test_seed_reproducibility(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=1, il_function=func)
        h2 = MinHasher(seed=2, il_function=func)
        r1 = h1.calculateMinHash()
        r2 = h2.calculateMinHash()
        # Different seeds should (very likely) produce different results
        assert r1 != r2