All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.deephaven.chunk.util.hashing.CharChunkHasher Maven / Gradle / Ivy

The newest version!
//
// Copyright (c) 2016-2024 Deephaven Data Labs and Patent Pending
//
package io.deephaven.chunk.util.hashing;

import io.deephaven.chunk.CharChunk;
import io.deephaven.chunk.Chunk;
import io.deephaven.chunk.WritableIntChunk;
import io.deephaven.chunk.attributes.HashCodes;
import io.deephaven.chunk.attributes.Values;
import io.deephaven.util.compare.CharComparisons;
import io.deephaven.util.type.TypeUtils;

import static io.deephaven.chunk.util.hashing.ChunkHasher.scrambleHash;

public class CharChunkHasher implements ChunkHasher {
    public static CharChunkHasher INSTANCE = new CharChunkHasher();

    private static void hashInitial(CharChunk values, WritableIntChunk destination) {
        for (int ii = 0; ii < values.size(); ++ii) {
            final char value = values.get(ii);
            destination.set(ii, hashInitialSingle(value));
        }
        destination.setSize(values.size());
    }

    private static void hashSecondary(CharChunk values, WritableIntChunk destination) {
        for (int ii = 0; ii < values.size(); ++ii) {
            destination.set(ii, hashUpdateSingle(destination.get(ii), values.get(ii)));
        }
        destination.setSize(values.size());
    }

    public static int hashInitialSingle(char value) {
        return scrambleHash(CharComparisons.hashCode(value));
    }

    public static int hashUpdateSingle(int existing, char newValue) {
        return existing * 31 + hashInitialSingle(newValue);
    }

    @Override
    public int hashInitial(Object value) {
        return hashInitialSingle(TypeUtils.unbox((Character) value));
    }

    @Override
    public int hashUpdate(int existing, Object value) {
        return hashUpdateSingle(existing, TypeUtils.unbox((Character) value));
    }

    @Override
    public void hashInitial(Chunk values, WritableIntChunk destination) {
        hashInitial(values.asCharChunk(), destination);
    }

    @Override
    public void hashUpdate(Chunk values, WritableIntChunk destination) {
        hashSecondary(values.asCharChunk(), destination);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy