Carsten Hentrich

17 papers C 1Misc 8Journal 5Unranked 1
YearRankTypeTitle / Venue / Authors
2014 Misc conf
EuroPLoP
Frank J. Frey, Carsten Hentrich, Uwe Zdun
2013 Misc conf
EuroPLoP
Carsten Hentrich, Uwe Zdun, Vlatka Hlupic, Fefie Dotsika
2013 Misc conf
EuroPLoP
Frank J. Frey, Carsten Hentrich, Uwe Zdun
2012 book
Carsten Hentrich, Uwe Zdun
2009 J jnl
Trans. Pattern Lang. Program.
Carsten Hentrich, Uwe Zdun
2009
Carsten Hentrich
2009 C conf
WETICE
Carsten Hentrich
2009 J jnl
Trans. Pattern Lang. Program.
Carsten Hentrich
2008 Misc conf
EuroPLoP
Carsten Hentrich, Uwe Zdun
2008 J jnl
IT Prof.
Wolf Zimmer, Thomas Langkabel, Carsten Hentrich
2008 conf
SHARK
Uwe Zdun, Paris Avgeriou, Carsten Hentrich, Schahram Dustdar
2007 J jnl
ACM Trans. Web
Uwe Zdun, Carsten Hentrich, Schahram Dustdar
2007 Misc conf
EuroPLoP
Carsten Hentrich, Uwe Zdun
2006 J jnl
Int. J. Internet Protoc. Technol.
Uwe Zdun, Carsten Hentrich, Wil M. P. van der Aalst
2006 Misc conf
EuroPLoP
Carsten Hentrich, Uwe Zdun
2006 Misc conf
EuroPLoP
Till Köllmann, Carsten Hentrich
2004 Misc conf
EuroPLoP
Carsten Hentrich
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