package io.divolte.server.processing; import java.nio.charset.StandardCharsets; import java.util.Objects; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault public final class Item<E> { public final int sourceId; public final int affinityHash; public final E payload; private static final HashFunction HASHER = Hashing.murmur3_32(42); private Item(final int sourceId, final int affinityHash, final E payload) { this.sourceId = sourceId; this.affinityHash = affinityHash; this.payload = Objects.requireNonNull(payload); } public static <E> Item<E> of(final int sourceId, final String key, final E payload) { return new Item<>( sourceId, // making sure the hash result is non-negative by masking with max int HASHER.hashString(key, StandardCharsets.UTF_8).asInt() & Integer.MAX_VALUE, payload); } public static <E> Item<E> withCopiedAffinity(final int sourceId, final Item<?> affinitySource, final E payload) { return new Item<>(sourceId, affinitySource.affinityHash, payload); } }