ijuma commented on code in PR #19523: URL: https://github.com/apache/kafka/pull/19523#discussion_r2070948145
########## group-coordinator/src/main/java/org/apache/kafka/coordinator/group/Utils.java: ########## @@ -324,4 +336,106 @@ static void throwIfRegularExpressionIsInvalid( regex, ex.getDescription())); } } + + /** + * The magic byte used to identify the version of topic hash function. + */ + static final byte TOPIC_HASH_MAGIC_BYTE = 0x00; + static final XXHash64 LZ4_HASH_INSTANCE = XXHashFactory.fastestInstance().hash64(); + + /** + * Computes the hash of the topics in a group. + * <p> + * The computed hash value is stored as part of the metadata hash in the *GroupMetadataValue. + * <p> + * The hashing process involves the following steps: + * 1. Sort the topic hashes by topic name. + * 2. Convert each long hash value into a byte array. + * 3. Combine the sorted byte arrays to produce a final hash for the group. + * + * @param topicHashes The map of topic hashes. Key is topic name and value is the topic hash. + * @return The hash of the group. + */ + static long computeGroupHash(Map<String, Long> topicHashes) { + // Convert long to byte array. This is taken from guava LongHashCode#asBytes. + // https://github.com/google/guava/blob/bdf2a9d05342fca852645278d474082905e09d94/guava/src/com/google/common/hash/HashCode.java#L187-L199 + LongFunction<byte[]> longToBytes = (long value) -> new byte[] { + (byte) value, + (byte) (value >> 8), + (byte) (value >> 16), + (byte) (value >> 24), + (byte) (value >> 32), + (byte) (value >> 40), + (byte) (value >> 48), + (byte) (value >> 56) + }; + + // Combine the sorted topic hashes. + byte[] resultBytes = new byte[8]; + topicHashes.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) // sort by topic name + .map(Map.Entry::getValue) + .map(longToBytes::apply) + .forEach(nextBytes -> { Review Comment: I think we're adding a lot of unnecessary overhead for the hash computation (multiple map calls, etc.). We should probably just use an old school loop. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: jira-unsubscr...@kafka.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org