summaryrefslogtreecommitdiffhomepage
path: root/packages/util/src
diff options
context:
space:
mode:
authorFilip <[email protected]>2026-02-13 12:08:13 +0100
committerGitHub <[email protected]>2026-02-13 05:08:13 -0600
commitebb907d646022d2e7bb8effc164e1f09943d64a9 (patch)
tree65662b4834701f2dc1e2e46da7ed5206341f8ba3 /packages/util/src
parentb8ee88212639ec63f4fe87555b5e87f74643e76b (diff)
downloadopencode-ebb907d646022d2e7bb8effc164e1f09943d64a9.tar.gz
opencode-ebb907d646022d2e7bb8effc164e1f09943d64a9.zip
fix(desktop): performance optimization for showing large diff & files (#13460)
Diffstat (limited to 'packages/util/src')
-rw-r--r--packages/util/src/encode.ts21
1 files changed, 21 insertions, 0 deletions
diff --git a/packages/util/src/encode.ts b/packages/util/src/encode.ts
index 138cf1608..e4c6e70ac 100644
--- a/packages/util/src/encode.ts
+++ b/packages/util/src/encode.ts
@@ -28,3 +28,24 @@ export function checksum(content: string): string | undefined {
}
return (hash >>> 0).toString(36)
}
+
+export function sampledChecksum(content: string, limit = 500_000): string | undefined {
+ if (!content) return undefined
+ if (content.length <= limit) return checksum(content)
+
+ const size = 4096
+ const points = [
+ 0,
+ Math.floor(content.length * 0.25),
+ Math.floor(content.length * 0.5),
+ Math.floor(content.length * 0.75),
+ content.length - size,
+ ]
+ const hashes = points
+ .map((point) => {
+ const start = Math.max(0, Math.min(content.length - size, point - Math.floor(size / 2)))
+ return checksum(content.slice(start, start + size)) ?? ""
+ })
+ .join(":")
+ return `${content.length}:${hashes}`
+}