Wei Dong

13 papers A* 5A 2B 1Journal 3
YearRankTypeTitle / Venue / Authors
2022 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Jason L. Causey, Keyu Li, Xianghao Chen, Wei Dong, Karl Walker, Jake A. Qualls, Jonathan W. Stubblefield, Jason H. Moore, Yuanfang Guan, Xiuzhen Huang
2021 J jnl
Int. J. Comput. Biol. Drug Des.
Jennifer Fowler, Jonathan W. Stubblefield, Jason L. Causey, Jake A. Qualls, Wei Dong, Hongmei Jiang, Karl Walker, Yuanfang Guan, Xiuzhen Huang
2019 J jnl
CoRR
Jason L. Causey, Yuanfang Guan, Wei Dong, Karl Walker, Jake A. Qualls, Fred W. Prior, Xiuzhen Huang
2012 B conf
ICMR
Wei Dong, Zhe Wang, Moses Charikar, Kai Li
2011 A* conf
WWW
Wei Dong, Moses Charikar, Kai Li
2011
Wei Dong
2011
Wei Dong
2011 A conf
FAST
Wei Dong, Fred Douglis, Kai Li, R. Hugo Patterson, Sazzala Reddy, Philip Shilane
2009 A* conf
CVPR
Jia Deng, Wei Dong, Richard Socher, Li-Jia Li, Kai Li, Li Fei-Fei
2008 A* conf
SIGIR
Wei Dong, Moses Charikar, Kai Li
2008 A* conf
ACM Multimedia
Wei Dong, Zhe Wang, Moses Charikar, Kai Li
2008 A conf
CIKM
Wei Dong, Zhe Wang, William Josephson, Moses Charikar, Kai Li
2007 A* conf
SIGMETRICS
Zhe Wang, Wei Dong, William Josephson, Qin Lv, Moses Charikar, Kai 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