diff --git a/agentscope-core/src/main/java/io/agentscope/core/session/ListHashUtil.java b/agentscope-core/src/main/java/io/agentscope/core/session/ListHashUtil.java index e31b3d847..090f9f1a3 100644 --- a/agentscope-core/src/main/java/io/agentscope/core/session/ListHashUtil.java +++ b/agentscope-core/src/main/java/io/agentscope/core/session/ListHashUtil.java @@ -16,6 +16,7 @@ package io.agentscope.core.session; import io.agentscope.core.state.State; +import io.agentscope.core.util.JsonUtils; import java.util.List; /** @@ -65,7 +66,7 @@ private ListHashUtil() { * * * *

This method is designed to be lightweight and fast, using sampling for large lists to @@ -88,13 +89,22 @@ public static String computeHash(List values) { for (int idx : sampleIndices) { State item = values.get(idx); - int itemHash = item != null ? item.hashCode() : 0; + int itemHash = computeItemHash(item); sb.append(idx).append(":").append(itemHash).append(","); } return Integer.toHexString(sb.toString().hashCode()); } + private static int computeItemHash(State item) { + if (item == null) { + return 0; + } + + String serialized = JsonUtils.getJsonCodec().toJson(item); + return serialized.hashCode(); + } + /** * Get the indices to sample from a list of given size. * diff --git a/agentscope-core/src/test/java/io/agentscope/core/session/ListHashUtilTest.java b/agentscope-core/src/test/java/io/agentscope/core/session/ListHashUtilTest.java index dfd10e20b..ea07a66f9 100644 --- a/agentscope-core/src/test/java/io/agentscope/core/session/ListHashUtilTest.java +++ b/agentscope-core/src/test/java/io/agentscope/core/session/ListHashUtilTest.java @@ -55,6 +55,17 @@ void testComputeHashSameListSameHash() { assertEquals(hash1, hash2); } + @Test + void testComputeHashEquivalentMsgListsSameHash() { + List list1 = createStableMsgList(5); + List list2 = createStableMsgList(5); + + String hash1 = ListHashUtil.computeHash(list1); + String hash2 = ListHashUtil.computeHash(list2); + + assertEquals(hash1, hash2); + } + @Test void testComputeHashListModifiedDifferentHash() { List list = createMsgList(5); @@ -205,4 +216,19 @@ private List createMsgList(int size) { } return list; } + + private List createStableMsgList(int size) { + List list = new ArrayList<>(); + for (int i = 0; i < size; i++) { + list.add( + Msg.builder() + .id("msg-" + i) + .name("user") + .role(MsgRole.USER) + .content(TextBlock.builder().text("message " + i).build()) + .timestamp("2026-01-01 00:00:0" + i + ".000") + .build()); + } + return list; + } }