Naresh Chand

11 papers Journal 1Unranked 10
YearRankTypeTitle / Venue / Authors
2017 conf
OFC
Mu Xu, Xiang Liu, Naresh Chand, Frank J. Effenberger, Gee-Kung Chang
2017 conf
OFC
Mu Xu, Xiang Liu, Naresh Chand, Frank J. Effenberger, Gee-Kung Chang
2016 conf
OFC
Xiang Liu, Huaiyu Zeng, Naresh Chand, Frank J. Effenberger
2015 J jnl
Photonic Netw. Commun.
Lei Zhou, Guikai Peng, Naresh Chand
2015 conf
OFC
Xiang Liu, Frank J. Effenberger, Naresh Chand, Lei Zhou, Huafeng Lin
2015 conf
ECOC
Cen Xia, He Wen, A. M. Velazquez-Benitez, Naresh Chand, Jose Enrique Antonio-Lopez, Bin Huang, Huiyuan Liu, Hongjun Zheng, Pierre Sillard, Xiang Liu, Frank J. Effenberger, Rodrigo Amezcua Correa, Guifang Li
2015 conf
ECOC
Xiang Liu, Huaiyu Zeng, Naresh Chand, Frank J. Effenberger
2015 conf
OFC
Ming Zhu, Xiang Liu, Naresh Chand, Frank J. Effenberger, Gee-Kung Chang
2014 conf
ONDM
Lei Zhou, Huafeng Lin, Guikai Peng, Naresh Chand, Zhen Ping Wang, Feng Wang, Frank J. Effenberger
2014 conf
ECOC
Lei Zhou, Naresh Chand, Xiang Liu, Guikai Peng, Huafeng Lin, Zebin Li, Zhen Ping Wang, Xiaofeng Zhang, Sam Wang, Frank J. Effenberger
2014 conf
ECOC
Cen Xia, Naresh Chand, A. M. Velazquez-Benitez, Xiang Liu, Jose Enrique Antonio Lopez, He Wen, Benyuan Zhu, Frank J. Effenberger, Rodrigo Amezcua Correa, Guifang Li
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