diff options
| author | Filip <[email protected]> | 2026-02-13 12:08:13 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-13 05:08:13 -0600 |
| commit | ebb907d646022d2e7bb8effc164e1f09943d64a9 (patch) | |
| tree | 65662b4834701f2dc1e2e46da7ed5206341f8ba3 /packages/util/src | |
| parent | b8ee88212639ec63f4fe87555b5e87f74643e76b (diff) | |
| download | opencode-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.ts | 21 |
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}` +} |
