Hanne Westh Nicolajsen

18 papers Journal 9Unranked 9
YearRankTypeTitle / Venue / Authors
2024 conf
ECIS
Louise Harder Fischer, Hanne Westh Nicolajsen, Sanna-Maria Marttila, Sunniva Sandbukt
2024 J jnl
Scand. J. Inf. Syst.
Raluca Stana, Hanne Westh Nicolajsen
2024 J jnl
CoRR
Raluca Stana, Louise Harder Fischer, Hanne Westh Nicolajsen
2023 conf
INTERACT Workshops (2)
Lene Nielsen, Hanne Westh Nicolajsen, Vasiliki Baka
2021 conf
HICSS
Raluca Stana, Hanne Westh Nicolajsen
2021 J jnl
Int. J. E Serv. Mob. Appl.
Ada Scupola, Hanne Westh Nicolajsen
2018 conf
HICSS
Gitte Tjørnehøj, Hanne Westh Nicolajsen
2016 J jnl
Int. J. E Serv. Mob. Appl.
Hanne Westh Nicolajsen, Flemming Sørensen, Ada Scupola
2014 conf
SCIS
Ada Scupola, Hanne Westh Nicolajsen
2013 J jnl
Int. J. E Bus. Res.
Ada Scupola, Hanne Westh Nicolajsen
2010 conf
EuroITV
Lene Sørensen, Hanne Westh Nicolajsen
2010 J jnl
IEEE Veh. Technol. Mag.
Lene Sørensen, Hanne Westh Nicolajsen
2009 J jnl
Int. J. E Serv. Mob. Appl.
Ada Scupola, Anders Henten, Hanne Westh Nicolajsen
2009 J jnl
Telematics Informatics
Anders Henten, Hanne Westh Nicolajsen
2008 J jnl
Scand. J. Inf. Syst.
Hanne Westh Nicolajsen, Rens Scheepers
2008 conf
SIGDOC
Hanne Westh Nicolajsen
2002 conf
ECIS
Dixi L. Henriksen, Hanne Westh Nicolajsen, Jens Kaaber Pors
2001 conf
ECIS
Kim Viborg Andersen, Hanne Westh Nicolajsen
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