From 49fdcca449c153ecfe332dbe24842d5c11f7979b Mon Sep 17 00:00:00 2001
From: Alexander Chuprov <a.chuprov@yadro.com>
Date: Thu, 13 Feb 2025 19:33:04 +0300
Subject: [PATCH] \[#294] container: Implement Cmp() function for ID struct

Signed-off-by: Alexander Chuprov <a.chuprov@yadro.com>
---
 container/id/id.go      |  7 +++++++
 container/id/id_test.go | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/container/id/id.go b/container/id/id.go
index 569968a..f76b3cd 100644
--- a/container/id/id.go
+++ b/container/id/id.go
@@ -1,6 +1,7 @@
 package cid
 
 import (
+	"bytes"
 	"crypto/sha256"
 	"fmt"
 
@@ -113,3 +114,9 @@ func (id *ID) DecodeString(s string) error {
 func (id ID) String() string {
 	return id.EncodeToString()
 }
+
+// Cmp returns an integer comparing two base58 encoded container ID lexicographically.
+// The result will be 0 if a == b, -1 if a < b, and +1 if a > b.
+func (id ID) Cmp(id2 ID) int {
+	return bytes.Compare([]byte(id.EncodeToString()), []byte(id2.EncodeToString()))
+}
diff --git a/container/id/id_test.go b/container/id/id_test.go
index 6f60d92..766d323 100644
--- a/container/id/id_test.go
+++ b/container/id/id_test.go
@@ -1,8 +1,10 @@
 package cid_test
 
 import (
+	"bytes"
 	"crypto/rand"
 	"crypto/sha256"
+	"slices"
 	"testing"
 
 	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/refs"
@@ -106,3 +108,19 @@ func TestID_Encode(t *testing.T) {
 		require.Equal(t, emptyID, id.EncodeToString())
 	})
 }
+
+func TestID__Cmp(t *testing.T) {
+	var arr []cid.ID
+	for i := 0; i < 3; i++ {
+		checksum := randSHA256Checksum()
+		arr = append(arr, cidtest.IDWithChecksum(checksum))
+	}
+
+	slices.SortFunc(arr, cid.ID.Cmp)
+
+	for i := 1; i < len(arr); i++ {
+		if bytes.Compare([]byte(arr[i-1].EncodeToString()), []byte(arr[i].EncodeToString())) > 0 {
+			t.Fatalf("arrays are not sorted correctly")
+		}
+	}
+}