Skip to content

Replace JSON.stringify based hashing by structural hashing#491

Merged
kevin-dp merged 3 commits intomainfrom
kevin/structural-hashing
Sep 8, 2025
Merged

Replace JSON.stringify based hashing by structural hashing#491
kevin-dp merged 3 commits intomainfrom
kevin/structural-hashing

Conversation

@kevin-dp
Copy link
Copy Markdown
Contributor

@kevin-dp kevin-dp commented Sep 3, 2025

This PR changes how we hash values. We used to JSON.stringify the values and then hash them. Now, we walk over the value's structure and hash each part. This implementation adapts the implementation from the composites polyfill. The composites hashing only supports hashing composites, we adapted it too also handle arrays, maps, and sets. We also support Buffer, Uint8Array, and File but hash them based on their object reference rather than their value because their value is likely to be big and hence hashing it would be too costly.

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Sep 3, 2025

🦋 Changeset detected

Latest commit: 5e2acee

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 9 packages
Name Type
@tanstack/db-ivm Patch
@tanstack/db Patch
@tanstack/electric-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Sep 3, 2025

More templates

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@491

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@491

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@491

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@491

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@491

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@491

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@491

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@491

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@491

commit: 5e2acee

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Sep 3, 2025

Size Change: 0 B

Total Size: 65 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/change-events.js 1.13 kB
./packages/db/dist/esm/collection.js 10.5 kB
./packages/db/dist/esm/deferred.js 230 B
./packages/db/dist/esm/errors.js 3.1 kB
./packages/db/dist/esm/index.js 1.52 kB
./packages/db/dist/esm/indexes/auto-index.js 745 B
./packages/db/dist/esm/indexes/base-index.js 605 B
./packages/db/dist/esm/indexes/btree-index.js 1.74 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.25 kB
./packages/db/dist/esm/local-only.js 827 B
./packages/db/dist/esm/local-storage.js 2.03 kB
./packages/db/dist/esm/optimistic-action.js 294 B
./packages/db/dist/esm/proxy.js 3.87 kB
./packages/db/dist/esm/query/builder/functions.js 575 B
./packages/db/dist/esm/query/builder/index.js 3.83 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 890 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.48 kB
./packages/db/dist/esm/query/compiler/expressions.js 631 B
./packages/db/dist/esm/query/compiler/group-by.js 2.09 kB
./packages/db/dist/esm/query/compiler/index.js 2.16 kB
./packages/db/dist/esm/query/compiler/joins.js 2.35 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.23 kB
./packages/db/dist/esm/query/compiler/select.js 655 B
./packages/db/dist/esm/query/ir.js 466 B
./packages/db/dist/esm/query/live-query-collection.js 333 B
./packages/db/dist/esm/query/live/collection-config-builder.js 2.58 kB
./packages/db/dist/esm/query/live/collection-subscriber.js 2.4 kB
./packages/db/dist/esm/query/optimizer.js 2.63 kB
./packages/db/dist/esm/SortedMap.js 1.24 kB
./packages/db/dist/esm/transactions.js 2.29 kB
./packages/db/dist/esm/utils.js 943 B
./packages/db/dist/esm/utils/btree.js 6.02 kB
./packages/db/dist/esm/utils/comparison.js 718 B
./packages/db/dist/esm/utils/index-optimization.js 1.62 kB

compressed-size-action::db-package-size

@kevin-dp kevin-dp requested a review from samwillis September 3, 2025 13:11
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Sep 3, 2025

Size Change: 0 B

Total Size: 1.18 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 152 B
./packages/react-db/dist/esm/useLiveQuery.js 1.02 kB

compressed-size-action::react-db-package-size

Copy link
Copy Markdown
Collaborator

@samwillis samwillis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perfect! :shipit:

@kevin-dp
Copy link
Copy Markdown
Contributor Author

kevin-dp commented Sep 3, 2025

@samwillis I would be keen to micro benchmark this PR against the base one to see how this new hashing function performs.

@kevin-dp kevin-dp force-pushed the kevin/structural-hashing branch from a0e394e to 49c0166 Compare September 4, 2025 07:39
Base automatically changed from kevin/hybrid-index to main September 8, 2025 10:59
@kevin-dp
Copy link
Copy Markdown
Contributor Author

kevin-dp commented Sep 8, 2025

We benchmarked initial load time for ts/db queries with the old hashing version and this structural hashing version. The performance figures looked similar with no noticeable differences. So we will merge this structural hashing implementation as it doesn't construct (big) intermediate strings and hence is more memory efficient.

@kevin-dp kevin-dp force-pushed the kevin/structural-hashing branch from 49c0166 to 5e2acee Compare September 8, 2025 12:01
@kevin-dp kevin-dp merged commit 0be4e2c into main Sep 8, 2025
6 checks passed
@kevin-dp kevin-dp deleted the kevin/structural-hashing branch September 8, 2025 12:07
@github-actions github-actions bot mentioned this pull request Sep 8, 2025
Uziniii pushed a commit to Uziniii/db that referenced this pull request Sep 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants