claude-flow-novice 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -5,766 +5,628 @@
|
|
|
5
5
|
* optimized for nanosecond-level performance in the memory store. The
|
|
6
6
|
* algorithms are designed to minimize CPU cycles, memory allocations,
|
|
7
7
|
* and cache misses while maintaining excellent hash distribution.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
8
|
+
*/ /**
|
|
11
9
|
* High-performance hash functions optimized for different key types
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
10
|
+
*/ export class HighPerformanceHash {
|
|
11
|
+
/**
|
|
15
12
|
* XXHash32 - Extremely fast hash function for small to medium keys
|
|
16
13
|
* Optimized for keys up to 64 bytes with excellent distribution
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
/**
|
|
14
|
+
*/ static xxhash32(key, seed = 0x811C9DC5) {
|
|
15
|
+
if (typeof key === 'string') {
|
|
16
|
+
return this.xxhash32String(key, seed);
|
|
17
|
+
} else if (key instanceof Uint8Array) {
|
|
18
|
+
return this.xxhash32Bytes(key, seed);
|
|
19
|
+
} else {
|
|
20
|
+
return this.xxhash32Generic(key, seed);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
29
24
|
* Optimized XXHash32 for string keys
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Final avalanche
|
|
71
|
-
hash ^= len;
|
|
72
|
-
hash ^= hash >>> 16;
|
|
73
|
-
hash = Math.imul(hash, PRIME32_2);
|
|
74
|
-
hash ^= hash >>> 13;
|
|
75
|
-
hash = Math.imul(hash, PRIME32_3);
|
|
76
|
-
hash ^= hash >>> 16;
|
|
77
|
-
|
|
78
|
-
return hash >>> 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
25
|
+
*/ static xxhash32String(str, seed = 0x811C9DC5) {
|
|
26
|
+
const PRIME32_1 = 0x9E3779B1;
|
|
27
|
+
const PRIME32_2 = 0x85EBCA77;
|
|
28
|
+
const PRIME32_3 = 0xC2B2AE3D;
|
|
29
|
+
const PRIME32_4 = 0x27D4EB2F;
|
|
30
|
+
const PRIME32_5 = 0x165667B1;
|
|
31
|
+
let hash = seed + PRIME32_5 >>> 0;
|
|
32
|
+
const len = str.length;
|
|
33
|
+
let i = 0;
|
|
34
|
+
// Process 4-character chunks
|
|
35
|
+
while(i <= len - 4){
|
|
36
|
+
let chunk = (str.charCodeAt(i) | str.charCodeAt(i + 1) << 8 | str.charCodeAt(i + 2) << 16 | str.charCodeAt(i + 3) << 24) >>> 0;
|
|
37
|
+
chunk = Math.imul(chunk, PRIME32_2);
|
|
38
|
+
chunk = (chunk << 13 | chunk >>> 19) >>> 0;
|
|
39
|
+
chunk = Math.imul(chunk, PRIME32_1);
|
|
40
|
+
hash ^= chunk;
|
|
41
|
+
hash = (hash << 13 | hash >>> 19) >>> 0;
|
|
42
|
+
hash = Math.imul(hash, 5) + 0xE6546B64 >>> 0;
|
|
43
|
+
i += 4;
|
|
44
|
+
}
|
|
45
|
+
// Process remaining characters
|
|
46
|
+
while(i < len){
|
|
47
|
+
let char = str.charCodeAt(i) >>> 0;
|
|
48
|
+
char = Math.imul(char, PRIME32_5);
|
|
49
|
+
char = (char << 11 | char >>> 21) >>> 0;
|
|
50
|
+
hash ^= char;
|
|
51
|
+
hash = (hash << 13 | hash >>> 19) >>> 0;
|
|
52
|
+
hash = Math.imul(hash, PRIME32_1);
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
// Final avalanche
|
|
56
|
+
hash ^= len;
|
|
57
|
+
hash ^= hash >>> 16;
|
|
58
|
+
hash = Math.imul(hash, PRIME32_2);
|
|
59
|
+
hash ^= hash >>> 13;
|
|
60
|
+
hash = Math.imul(hash, PRIME32_3);
|
|
61
|
+
hash ^= hash >>> 16;
|
|
62
|
+
return hash >>> 0;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
82
65
|
* Optimized XXHash32 for byte arrays
|
|
83
|
-
*/
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
hash ^= hash >>> 16;
|
|
125
|
-
hash = Math.imul(hash, PRIME32_2);
|
|
126
|
-
hash ^= hash >>> 13;
|
|
127
|
-
hash = Math.imul(hash, PRIME32_3);
|
|
128
|
-
hash ^= hash >>> 16;
|
|
129
|
-
|
|
130
|
-
return hash >>> 0;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
66
|
+
*/ static xxhash32Bytes(bytes, seed = 0x811C9DC5) {
|
|
67
|
+
const PRIME32_1 = 0x9E3779B1;
|
|
68
|
+
const PRIME32_2 = 0x85EBCA77;
|
|
69
|
+
const PRIME32_3 = 0xC2B2AE3D;
|
|
70
|
+
const PRIME32_4 = 0x27D4EB2F;
|
|
71
|
+
const PRIME32_5 = 0x165667B1;
|
|
72
|
+
let hash = seed + PRIME32_5 >>> 0;
|
|
73
|
+
const len = bytes.length;
|
|
74
|
+
let i = 0;
|
|
75
|
+
// Process 4-byte chunks using DataView for optimal performance
|
|
76
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
77
|
+
while(i <= len - 4){
|
|
78
|
+
let chunk = view.getUint32(i, true); // little-endian
|
|
79
|
+
chunk = Math.imul(chunk, PRIME32_2);
|
|
80
|
+
chunk = (chunk << 13 | chunk >>> 19) >>> 0;
|
|
81
|
+
chunk = Math.imul(chunk, PRIME32_1);
|
|
82
|
+
hash ^= chunk;
|
|
83
|
+
hash = (hash << 13 | hash >>> 19) >>> 0;
|
|
84
|
+
hash = Math.imul(hash, 5) + 0xE6546B64 >>> 0;
|
|
85
|
+
i += 4;
|
|
86
|
+
}
|
|
87
|
+
// Process remaining bytes
|
|
88
|
+
while(i < len){
|
|
89
|
+
let byte = bytes[i] >>> 0;
|
|
90
|
+
byte = Math.imul(byte, PRIME32_5);
|
|
91
|
+
byte = (byte << 11 | byte >>> 21) >>> 0;
|
|
92
|
+
hash ^= byte;
|
|
93
|
+
hash = (hash << 13 | hash >>> 19) >>> 0;
|
|
94
|
+
hash = Math.imul(hash, PRIME32_1);
|
|
95
|
+
i++;
|
|
96
|
+
}
|
|
97
|
+
// Final avalanche
|
|
98
|
+
hash ^= len;
|
|
99
|
+
hash ^= hash >>> 16;
|
|
100
|
+
hash = Math.imul(hash, PRIME32_2);
|
|
101
|
+
hash ^= hash >>> 13;
|
|
102
|
+
hash = Math.imul(hash, PRIME32_3);
|
|
103
|
+
hash ^= hash >>> 16;
|
|
104
|
+
return hash >>> 0;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
134
107
|
* Generic XXHash32 for any serializable value
|
|
135
|
-
*/
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
/**
|
|
108
|
+
*/ static xxhash32Generic(value, seed = 0x811C9DC5) {
|
|
109
|
+
const serialized = FastSerializer.serialize(value);
|
|
110
|
+
return this.xxhash32Bytes(serialized, seed);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
142
113
|
* FNV-1a hash - Fast and simple, good for short keys
|
|
143
|
-
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return hash >>> 0;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
114
|
+
*/ static fnv1a32(key) {
|
|
115
|
+
let hash = 0x811C9DC5;
|
|
116
|
+
if (typeof key === 'string') {
|
|
117
|
+
for(let i = 0; i < key.length; i++){
|
|
118
|
+
hash ^= key.charCodeAt(i);
|
|
119
|
+
hash = Math.imul(hash, 0x01000193);
|
|
120
|
+
}
|
|
121
|
+
} else if (key instanceof Uint8Array) {
|
|
122
|
+
for(let i = 0; i < key.length; i++){
|
|
123
|
+
hash ^= key[i];
|
|
124
|
+
hash = Math.imul(hash, 0x01000193);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
const serialized = FastSerializer.serialize(key);
|
|
128
|
+
return this.fnv1a32(serialized);
|
|
129
|
+
}
|
|
130
|
+
return hash >>> 0;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
166
133
|
* CityHash32 variant - Good distribution for medium keys
|
|
167
|
-
*/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
static cityHashFinalize32(a, b, c) {
|
|
216
|
-
a = Math.imul(a - c, 0x9E3779B1) >>> 0;
|
|
217
|
-
b = Math.imul(b - a, 0x9E3779B1) >>> 0;
|
|
218
|
-
c = Math.imul(c - b, 0x9E3779B1) >>> 0;
|
|
219
|
-
a = Math.imul(a - c, 0x9E3779B1) >>> 0;
|
|
220
|
-
b = Math.imul(b - a, 0x9E3779B1) >>> 0;
|
|
221
|
-
c = Math.imul(c - b, 0x9E3779B1) >>> 0;
|
|
222
|
-
return c >>> 0;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
134
|
+
*/ static cityHash32(key) {
|
|
135
|
+
const bytes = typeof key === 'string' ? new TextEncoder().encode(key) : key;
|
|
136
|
+
const len = bytes.length;
|
|
137
|
+
if (len <= 4) return this.cityHash32Short(bytes);
|
|
138
|
+
if (len <= 8) return this.cityHash32Medium(bytes);
|
|
139
|
+
return this.cityHash32Long(bytes);
|
|
140
|
+
}
|
|
141
|
+
static cityHash32Short(bytes) {
|
|
142
|
+
const len = bytes.length;
|
|
143
|
+
let a = len;
|
|
144
|
+
let b = len * 5;
|
|
145
|
+
let c = 9;
|
|
146
|
+
if (len >= 1) a ^= bytes[0];
|
|
147
|
+
if (len >= 2) b ^= bytes[1];
|
|
148
|
+
if (len >= 3) c ^= bytes[2];
|
|
149
|
+
if (len >= 4) a ^= bytes[3] << 24;
|
|
150
|
+
return this.cityHashFinalize32(a, b, c);
|
|
151
|
+
}
|
|
152
|
+
static cityHash32Medium(bytes) {
|
|
153
|
+
const len = bytes.length;
|
|
154
|
+
let a = len;
|
|
155
|
+
let b = len * 5;
|
|
156
|
+
let c = 9;
|
|
157
|
+
// Process first 4 bytes
|
|
158
|
+
if (len >= 4) {
|
|
159
|
+
a ^= (bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24) >>> 0;
|
|
160
|
+
}
|
|
161
|
+
// Process next 4 bytes
|
|
162
|
+
if (len >= 8) {
|
|
163
|
+
b ^= (bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24) >>> 0;
|
|
164
|
+
}
|
|
165
|
+
return this.cityHashFinalize32(a, b, c);
|
|
166
|
+
}
|
|
167
|
+
static cityHash32Long(bytes) {
|
|
168
|
+
// Simplified long version for demonstration
|
|
169
|
+
return this.xxhash32Bytes(bytes);
|
|
170
|
+
}
|
|
171
|
+
static cityHashFinalize32(a, b, c) {
|
|
172
|
+
a = Math.imul(a - c, 0x9E3779B1) >>> 0;
|
|
173
|
+
b = Math.imul(b - a, 0x9E3779B1) >>> 0;
|
|
174
|
+
c = Math.imul(c - b, 0x9E3779B1) >>> 0;
|
|
175
|
+
a = Math.imul(a - c, 0x9E3779B1) >>> 0;
|
|
176
|
+
b = Math.imul(b - a, 0x9E3779B1) >>> 0;
|
|
177
|
+
c = Math.imul(c - b, 0x9E3779B1) >>> 0;
|
|
178
|
+
return c >>> 0;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
226
181
|
* MurmurHash3 - Excellent distribution for hash tables
|
|
227
|
-
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
return h1 >>> 0;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
182
|
+
*/ static murmurHash3_32(key, seed = 0x12345678) {
|
|
183
|
+
const bytes = typeof key === 'string' ? new TextEncoder().encode(key) : key;
|
|
184
|
+
const len = bytes.length;
|
|
185
|
+
const c1 = 0xCC9E2D51;
|
|
186
|
+
const c2 = 0x1B873593;
|
|
187
|
+
let h1 = seed;
|
|
188
|
+
let i = 0;
|
|
189
|
+
// Process 4-byte chunks
|
|
190
|
+
while(i <= len - 4){
|
|
191
|
+
let k1 = (bytes[i] | bytes[i + 1] << 8 | bytes[i + 2] << 16 | bytes[i + 3] << 24) >>> 0;
|
|
192
|
+
k1 = Math.imul(k1, c1);
|
|
193
|
+
k1 = (k1 << 15 | k1 >>> 17) >>> 0;
|
|
194
|
+
k1 = Math.imul(k1, c2);
|
|
195
|
+
h1 ^= k1;
|
|
196
|
+
h1 = (h1 << 13 | h1 >>> 19) >>> 0;
|
|
197
|
+
h1 = Math.imul(h1, 5) + 0xE6546B64 >>> 0;
|
|
198
|
+
i += 4;
|
|
199
|
+
}
|
|
200
|
+
// Process remaining bytes
|
|
201
|
+
let k1 = 0;
|
|
202
|
+
switch(len & 3){
|
|
203
|
+
case 3:
|
|
204
|
+
k1 ^= bytes[i + 2] << 16;
|
|
205
|
+
case 2:
|
|
206
|
+
k1 ^= bytes[i + 1] << 8;
|
|
207
|
+
case 1:
|
|
208
|
+
k1 ^= bytes[i];
|
|
209
|
+
k1 = Math.imul(k1, c1);
|
|
210
|
+
k1 = (k1 << 15 | k1 >>> 17) >>> 0;
|
|
211
|
+
k1 = Math.imul(k1, c2);
|
|
212
|
+
h1 ^= k1;
|
|
213
|
+
}
|
|
214
|
+
// Finalization
|
|
215
|
+
h1 ^= len;
|
|
216
|
+
h1 ^= h1 >>> 16;
|
|
217
|
+
h1 = Math.imul(h1, 0x85EBCA6B);
|
|
218
|
+
h1 ^= h1 >>> 13;
|
|
219
|
+
h1 = Math.imul(h1, 0xC2B2AE35);
|
|
220
|
+
h1 ^= h1 >>> 16;
|
|
221
|
+
return h1 >>> 0;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
274
224
|
* Select optimal hash function based on key characteristics
|
|
275
|
-
*/
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
/**
|
|
225
|
+
*/ static selectOptimalHash(key) {
|
|
226
|
+
if (typeof key === 'string') {
|
|
227
|
+
if (key.length <= 16) return 'fnv1a32';
|
|
228
|
+
if (key.length <= 64) return 'xxhash32';
|
|
229
|
+
return 'murmurHash3_32';
|
|
230
|
+
} else if (key instanceof Uint8Array) {
|
|
231
|
+
if (key.length <= 4) return 'fnv1a32';
|
|
232
|
+
if (key.length <= 32) return 'xxhash32';
|
|
233
|
+
return 'cityHash32';
|
|
234
|
+
} else {
|
|
235
|
+
return 'xxhash32'; // Default for generic objects
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
291
239
|
* Adaptive hash function that selects the best algorithm
|
|
292
|
-
*/
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
240
|
+
*/ static adaptiveHash(key, seed = 0x811C9DC5) {
|
|
241
|
+
const algorithm = this.selectOptimalHash(key);
|
|
242
|
+
switch(algorithm){
|
|
243
|
+
case 'fnv1a32':
|
|
244
|
+
return this.fnv1a32(key);
|
|
245
|
+
case 'xxhash32':
|
|
246
|
+
return this.xxhash32(key, seed);
|
|
247
|
+
case 'murmurHash3_32':
|
|
248
|
+
return this.murmurHash3_32(key, seed);
|
|
249
|
+
case 'cityHash32':
|
|
250
|
+
return this.cityHash32(key);
|
|
251
|
+
default:
|
|
252
|
+
return this.xxhash32(key, seed);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
306
256
|
/**
|
|
307
257
|
* Ultra-fast serialization for JavaScript values
|
|
308
|
-
*/
|
|
309
|
-
|
|
310
|
-
/**
|
|
258
|
+
*/ export class FastSerializer {
|
|
259
|
+
/**
|
|
311
260
|
* Serialize JavaScript value to Uint8Array with minimal overhead
|
|
312
|
-
*/
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
261
|
+
*/ static serialize(value) {
|
|
262
|
+
const type = typeof value;
|
|
263
|
+
switch(type){
|
|
264
|
+
case 'string':
|
|
265
|
+
return this.serializeString(value);
|
|
266
|
+
case 'number':
|
|
267
|
+
return this.serializeNumber(value);
|
|
268
|
+
case 'boolean':
|
|
269
|
+
return this.serializeBoolean(value);
|
|
270
|
+
case 'object':
|
|
271
|
+
if (value === null) return this.serializeNull();
|
|
272
|
+
if (value instanceof Uint8Array) return value;
|
|
273
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
274
|
+
if (Array.isArray(value)) return this.serializeArray(value);
|
|
275
|
+
return this.serializeObject(value);
|
|
276
|
+
case 'undefined':
|
|
277
|
+
return this.serializeUndefined();
|
|
278
|
+
default:
|
|
279
|
+
return this.serializeString(String(value));
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
337
283
|
* High-performance string serialization using TextEncoder
|
|
338
|
-
*/
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
return result;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
/**
|
|
284
|
+
*/ static serializeString(str) {
|
|
285
|
+
// Cache TextEncoder instance for reuse
|
|
286
|
+
if (!this._textEncoder) {
|
|
287
|
+
this._textEncoder = new TextEncoder();
|
|
288
|
+
}
|
|
289
|
+
const encoded = this._textEncoder.encode(str);
|
|
290
|
+
const result = new Uint8Array(encoded.length + 5);
|
|
291
|
+
result[0] = 0x01; // String type marker
|
|
292
|
+
result[1] = encoded.length >>> 24 & 0xFF;
|
|
293
|
+
result[2] = encoded.length >>> 16 & 0xFF;
|
|
294
|
+
result[3] = encoded.length >>> 8 & 0xFF;
|
|
295
|
+
result[4] = encoded.length & 0xFF;
|
|
296
|
+
result.set(encoded, 5);
|
|
297
|
+
return result;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
359
300
|
* Optimized number serialization
|
|
360
|
-
*/
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
return result;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
301
|
+
*/ static serializeNumber(num) {
|
|
302
|
+
const result = new Uint8Array(9);
|
|
303
|
+
const view = new DataView(result.buffer);
|
|
304
|
+
result[0] = 0x02; // Number type marker
|
|
305
|
+
view.setFloat64(1, num, true); // little-endian
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
372
309
|
* Compact boolean serialization
|
|
373
|
-
*/
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
310
|
+
*/ static serializeBoolean(bool) {
|
|
311
|
+
return new Uint8Array([
|
|
312
|
+
0x03,
|
|
313
|
+
bool ? 1 : 0
|
|
314
|
+
]);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
379
317
|
* Null value serialization
|
|
380
|
-
*/
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
318
|
+
*/ static serializeNull() {
|
|
319
|
+
return new Uint8Array([
|
|
320
|
+
0x04
|
|
321
|
+
]);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
386
324
|
* Undefined value serialization
|
|
387
|
-
*/
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
325
|
+
*/ static serializeUndefined() {
|
|
326
|
+
return new Uint8Array([
|
|
327
|
+
0x05
|
|
328
|
+
]);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
393
331
|
* Array serialization with length prefix
|
|
394
|
-
*/
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
return result;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
332
|
+
*/ static serializeArray(arr) {
|
|
333
|
+
const serializedItems = arr.map((item)=>this.serialize(item));
|
|
334
|
+
const totalLength = serializedItems.reduce((sum, item)=>sum + item.length, 0);
|
|
335
|
+
const result = new Uint8Array(totalLength + 5);
|
|
336
|
+
const view = new DataView(result.buffer);
|
|
337
|
+
result[0] = 0x06; // Array type marker
|
|
338
|
+
view.setUint32(1, arr.length, true); // little-endian
|
|
339
|
+
let offset = 5;
|
|
340
|
+
for (const item of serializedItems){
|
|
341
|
+
result.set(item, offset);
|
|
342
|
+
offset += item.length;
|
|
343
|
+
}
|
|
344
|
+
return result;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
415
347
|
* Object serialization with key sorting for deterministic output
|
|
416
|
-
*/
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
offset += item.length;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
return result;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
/**
|
|
348
|
+
*/ static serializeObject(obj) {
|
|
349
|
+
const keys = Object.keys(obj).sort(); // Deterministic key order
|
|
350
|
+
const serializedPairs = [];
|
|
351
|
+
for (const key of keys){
|
|
352
|
+
const serializedKey = this.serializeString(key);
|
|
353
|
+
const serializedValue = this.serialize(obj[key]);
|
|
354
|
+
serializedPairs.push(serializedKey, serializedValue);
|
|
355
|
+
}
|
|
356
|
+
const totalLength = serializedPairs.reduce((sum, item)=>sum + item.length, 0);
|
|
357
|
+
const result = new Uint8Array(totalLength + 5);
|
|
358
|
+
const view = new DataView(result.buffer);
|
|
359
|
+
result[0] = 0x07; // Object type marker
|
|
360
|
+
view.setUint32(1, keys.length, true); // Number of key-value pairs
|
|
361
|
+
let offset = 5;
|
|
362
|
+
for (const item of serializedPairs){
|
|
363
|
+
result.set(item, offset);
|
|
364
|
+
offset += item.length;
|
|
365
|
+
}
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
444
369
|
* Deserialize Uint8Array back to JavaScript value
|
|
445
|
-
*/
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
throw new Error(`Unknown type marker: ${type}`);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
static findComplexItemEnd(bytes, start) {
|
|
547
|
-
// Simplified implementation - in practice would need full recursive parsing
|
|
548
|
-
// This is a placeholder that should be implemented based on the specific format
|
|
549
|
-
throw new Error('Complex type end finding not implemented');
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
370
|
+
*/ static deserialize(bytes) {
|
|
371
|
+
if (bytes.length === 0) return undefined;
|
|
372
|
+
const type = bytes[0];
|
|
373
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
374
|
+
switch(type){
|
|
375
|
+
case 0x01:
|
|
376
|
+
return this.deserializeString(bytes, view);
|
|
377
|
+
case 0x02:
|
|
378
|
+
return this.deserializeNumber(view);
|
|
379
|
+
case 0x03:
|
|
380
|
+
return this.deserializeBoolean(bytes);
|
|
381
|
+
case 0x04:
|
|
382
|
+
return null;
|
|
383
|
+
case 0x05:
|
|
384
|
+
return undefined;
|
|
385
|
+
case 0x06:
|
|
386
|
+
return this.deserializeArray(bytes, view);
|
|
387
|
+
case 0x07:
|
|
388
|
+
return this.deserializeObject(bytes, view);
|
|
389
|
+
default:
|
|
390
|
+
throw new Error(`Unknown type marker: ${type}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
static deserializeString(bytes, view) {
|
|
394
|
+
if (!this._textDecoder) {
|
|
395
|
+
this._textDecoder = new TextDecoder();
|
|
396
|
+
}
|
|
397
|
+
const length = view.getUint32(1, true);
|
|
398
|
+
const stringBytes = bytes.slice(5, 5 + length);
|
|
399
|
+
return this._textDecoder.decode(stringBytes);
|
|
400
|
+
}
|
|
401
|
+
static deserializeNumber(view) {
|
|
402
|
+
return view.getFloat64(1, true);
|
|
403
|
+
}
|
|
404
|
+
static deserializeBoolean(bytes) {
|
|
405
|
+
return bytes[1] === 1;
|
|
406
|
+
}
|
|
407
|
+
static deserializeArray(bytes, view) {
|
|
408
|
+
const length = view.getUint32(1, true);
|
|
409
|
+
const result = new Array(length);
|
|
410
|
+
let offset = 5;
|
|
411
|
+
for(let i = 0; i < length; i++){
|
|
412
|
+
const itemType = bytes[offset];
|
|
413
|
+
const itemEnd = this.findItemEnd(bytes, offset);
|
|
414
|
+
const itemBytes = bytes.slice(offset, itemEnd);
|
|
415
|
+
result[i] = this.deserialize(itemBytes);
|
|
416
|
+
offset = itemEnd;
|
|
417
|
+
}
|
|
418
|
+
return result;
|
|
419
|
+
}
|
|
420
|
+
static deserializeObject(bytes, view) {
|
|
421
|
+
const pairCount = view.getUint32(1, true);
|
|
422
|
+
const result = {};
|
|
423
|
+
let offset = 5;
|
|
424
|
+
for(let i = 0; i < pairCount; i++){
|
|
425
|
+
// Deserialize key
|
|
426
|
+
const keyEnd = this.findItemEnd(bytes, offset);
|
|
427
|
+
const keyBytes = bytes.slice(offset, keyEnd);
|
|
428
|
+
const key = this.deserialize(keyBytes);
|
|
429
|
+
offset = keyEnd;
|
|
430
|
+
// Deserialize value
|
|
431
|
+
const valueEnd = this.findItemEnd(bytes, offset);
|
|
432
|
+
const valueBytes = bytes.slice(offset, valueEnd);
|
|
433
|
+
const value = this.deserialize(valueBytes);
|
|
434
|
+
offset = valueEnd;
|
|
435
|
+
result[key] = value;
|
|
436
|
+
}
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
static findItemEnd(bytes, start) {
|
|
440
|
+
const type = bytes[start];
|
|
441
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
442
|
+
switch(type){
|
|
443
|
+
case 0x01:
|
|
444
|
+
const strLength = view.getUint32(start + 1, true);
|
|
445
|
+
return start + 5 + strLength;
|
|
446
|
+
case 0x02:
|
|
447
|
+
return start + 9;
|
|
448
|
+
case 0x03:
|
|
449
|
+
return start + 2;
|
|
450
|
+
case 0x04:
|
|
451
|
+
case 0x05:
|
|
452
|
+
return start + 1;
|
|
453
|
+
case 0x06:
|
|
454
|
+
case 0x07:
|
|
455
|
+
// Complex types require recursive parsing
|
|
456
|
+
return this.findComplexItemEnd(bytes, start);
|
|
457
|
+
default:
|
|
458
|
+
throw new Error(`Unknown type marker: ${type}`);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
static findComplexItemEnd(bytes, start) {
|
|
462
|
+
// Simplified implementation - in practice would need full recursive parsing
|
|
463
|
+
// This is a placeholder that should be implemented based on the specific format
|
|
464
|
+
throw new Error('Complex type end finding not implemented');
|
|
465
|
+
}
|
|
466
|
+
}
|
|
553
467
|
/**
|
|
554
468
|
* Namespace-aware key serialization
|
|
555
|
-
*/
|
|
556
|
-
|
|
557
|
-
/**
|
|
469
|
+
*/ export class NamespaceKeySerializer {
|
|
470
|
+
/**
|
|
558
471
|
* Serialize key with namespace information
|
|
559
|
-
*/
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
result.set(keyBytes, 8 + namespaceBytes.length);
|
|
574
|
-
|
|
575
|
-
return result;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
/**
|
|
472
|
+
*/ static serializeNamespacedKey(namespace, key) {
|
|
473
|
+
const namespaceBytes = FastSerializer.serialize(namespace);
|
|
474
|
+
const keyBytes = FastSerializer.serialize(key);
|
|
475
|
+
const result = new Uint8Array(namespaceBytes.length + keyBytes.length + 8);
|
|
476
|
+
const view = new DataView(result.buffer);
|
|
477
|
+
// Header: namespace length + key length
|
|
478
|
+
view.setUint32(0, namespaceBytes.length, true);
|
|
479
|
+
view.setUint32(4, keyBytes.length, true);
|
|
480
|
+
// Data: namespace + key
|
|
481
|
+
result.set(namespaceBytes, 8);
|
|
482
|
+
result.set(keyBytes, 8 + namespaceBytes.length);
|
|
483
|
+
return result;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
579
486
|
* Generate composite hash for namespaced key
|
|
580
|
-
*/
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
/**
|
|
487
|
+
*/ static hashNamespacedKey(namespace, key, seed = 0x12345678) {
|
|
488
|
+
const namespaceHash = HighPerformanceHash.adaptiveHash(namespace, seed);
|
|
489
|
+
const keyHash = HighPerformanceHash.adaptiveHash(key, namespaceHash);
|
|
490
|
+
// Combine hashes using multiplication and XOR
|
|
491
|
+
return Math.imul(namespaceHash, 0x9E3779B1) ^ keyHash;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
590
494
|
* Fast namespace ID lookup with caching
|
|
591
|
-
*/
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
return namespaceId;
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
495
|
+
*/ static resolveNamespace(namespaceName, namespaceMap) {
|
|
496
|
+
let namespaceId = namespaceMap.get(namespaceName);
|
|
497
|
+
if (namespaceId === undefined) {
|
|
498
|
+
namespaceId = HighPerformanceHash.fnv1a32(namespaceName);
|
|
499
|
+
namespaceMap.set(namespaceName, namespaceId);
|
|
500
|
+
}
|
|
501
|
+
return namespaceId;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
604
504
|
/**
|
|
605
505
|
* Performance benchmarking for serialization and hashing
|
|
606
|
-
*/
|
|
607
|
-
|
|
608
|
-
constructor() {
|
|
609
|
-
this.results = new Map();
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
/**
|
|
506
|
+
*/ export class SerializationBenchmark {
|
|
507
|
+
/**
|
|
613
508
|
* Benchmark hash function performance
|
|
614
|
-
*/
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
operationsPerSecond: 1000000000 / avgTime
|
|
640
|
-
};
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
return results;
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
/**
|
|
509
|
+
*/ benchmarkHashFunctions(testData, iterations = 100000) {
|
|
510
|
+
const functions = [
|
|
511
|
+
'fnv1a32',
|
|
512
|
+
'xxhash32',
|
|
513
|
+
'murmurHash3_32',
|
|
514
|
+
'cityHash32',
|
|
515
|
+
'adaptiveHash'
|
|
516
|
+
];
|
|
517
|
+
const results = {};
|
|
518
|
+
for (const funcName of functions){
|
|
519
|
+
const start = performance.now() * 1000000; // nanoseconds
|
|
520
|
+
for(let i = 0; i < iterations; i++){
|
|
521
|
+
HighPerformanceHash[funcName](testData);
|
|
522
|
+
}
|
|
523
|
+
const end = performance.now() * 1000000;
|
|
524
|
+
const avgTime = (end - start) / iterations;
|
|
525
|
+
results[funcName] = {
|
|
526
|
+
totalTime: end - start,
|
|
527
|
+
avgTimePerOp: avgTime,
|
|
528
|
+
operationsPerSecond: 1000000000 / avgTime
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
return results;
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
647
534
|
* Benchmark serialization performance
|
|
648
|
-
*/
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
results.roundTrip = {
|
|
679
|
-
totalTime: roundTripEnd - roundTripStart,
|
|
680
|
-
avgTimePerOp: (roundTripEnd - roundTripStart) / iterations,
|
|
681
|
-
operationsPerSecond: 1000000000 / ((roundTripEnd - roundTripStart) / iterations),
|
|
682
|
-
serializedSize: serialized.length
|
|
683
|
-
};
|
|
684
|
-
|
|
685
|
-
return results;
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/**
|
|
535
|
+
*/ benchmarkSerialization(testData, iterations = 50000) {
|
|
536
|
+
const results = {};
|
|
537
|
+
// Serialization benchmark
|
|
538
|
+
const start = performance.now() * 1000000;
|
|
539
|
+
for(let i = 0; i < iterations; i++){
|
|
540
|
+
FastSerializer.serialize(testData);
|
|
541
|
+
}
|
|
542
|
+
const end = performance.now() * 1000000;
|
|
543
|
+
results.serialization = {
|
|
544
|
+
totalTime: end - start,
|
|
545
|
+
avgTimePerOp: (end - start) / iterations,
|
|
546
|
+
operationsPerSecond: 1000000000 / ((end - start) / iterations)
|
|
547
|
+
};
|
|
548
|
+
// Round-trip benchmark
|
|
549
|
+
const serialized = FastSerializer.serialize(testData);
|
|
550
|
+
const roundTripStart = performance.now() * 1000000;
|
|
551
|
+
for(let i = 0; i < iterations; i++){
|
|
552
|
+
const data = FastSerializer.serialize(testData);
|
|
553
|
+
FastSerializer.deserialize(data);
|
|
554
|
+
}
|
|
555
|
+
const roundTripEnd = performance.now() * 1000000;
|
|
556
|
+
results.roundTrip = {
|
|
557
|
+
totalTime: roundTripEnd - roundTripStart,
|
|
558
|
+
avgTimePerOp: (roundTripEnd - roundTripStart) / iterations,
|
|
559
|
+
operationsPerSecond: 1000000000 / ((roundTripEnd - roundTripStart) / iterations),
|
|
560
|
+
serializedSize: serialized.length
|
|
561
|
+
};
|
|
562
|
+
return results;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
689
565
|
* Hash distribution quality test
|
|
690
|
-
*/
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
stdDev,
|
|
724
|
-
coefficientOfVariation: coefficient,
|
|
725
|
-
quality: coefficient < 0.1 ? 'Excellent' :
|
|
726
|
-
coefficient < 0.2 ? 'Good' :
|
|
727
|
-
coefficient < 0.3 ? 'Fair' : 'Poor'
|
|
728
|
-
};
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
/**
|
|
566
|
+
*/ testHashDistribution(hashFunction, keyGenerator, bucketCount = 10000, keyCount = 100000) {
|
|
567
|
+
const buckets = new Array(bucketCount).fill(0);
|
|
568
|
+
for(let i = 0; i < keyCount; i++){
|
|
569
|
+
const key = keyGenerator(i);
|
|
570
|
+
const hash = HighPerformanceHash[hashFunction](key);
|
|
571
|
+
const bucketIndex = hash % bucketCount;
|
|
572
|
+
buckets[bucketIndex]++;
|
|
573
|
+
}
|
|
574
|
+
// Calculate distribution metrics
|
|
575
|
+
const expectedPerBucket = keyCount / bucketCount;
|
|
576
|
+
let sumSquaredDiffs = 0;
|
|
577
|
+
let minBucket = buckets[0];
|
|
578
|
+
let maxBucket = buckets[0];
|
|
579
|
+
for (const count of buckets){
|
|
580
|
+
const diff = count - expectedPerBucket;
|
|
581
|
+
sumSquaredDiffs += diff * diff;
|
|
582
|
+
minBucket = Math.min(minBucket, count);
|
|
583
|
+
maxBucket = Math.max(maxBucket, count);
|
|
584
|
+
}
|
|
585
|
+
const variance = sumSquaredDiffs / bucketCount;
|
|
586
|
+
const stdDev = Math.sqrt(variance);
|
|
587
|
+
const coefficient = stdDev / expectedPerBucket;
|
|
588
|
+
return {
|
|
589
|
+
minBucket,
|
|
590
|
+
maxBucket,
|
|
591
|
+
expectedPerBucket,
|
|
592
|
+
variance,
|
|
593
|
+
stdDev,
|
|
594
|
+
coefficientOfVariation: coefficient,
|
|
595
|
+
quality: coefficient < 0.1 ? 'Excellent' : coefficient < 0.2 ? 'Good' : coefficient < 0.3 ? 'Fair' : 'Poor'
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
732
599
|
* Generate comprehensive performance report
|
|
733
|
-
*/
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
);
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
// Export commonly used combinations
|
|
768
|
-
export const DefaultHashFunction = HighPerformanceHash.xxhash32;
|
|
769
|
-
export const FastHash = HighPerformanceHash.fnv1a32;
|
|
770
|
-
export const QualityHash = HighPerformanceHash.murmurHash3_32;
|
|
600
|
+
*/ generatePerformanceReport(testCases) {
|
|
601
|
+
const report = {
|
|
602
|
+
timestamp: Date.now(),
|
|
603
|
+
hashFunctions: {},
|
|
604
|
+
serialization: {},
|
|
605
|
+
distribution: {}
|
|
606
|
+
};
|
|
607
|
+
for (const testCase of testCases){
|
|
608
|
+
// Hash function benchmarks
|
|
609
|
+
report.hashFunctions[testCase.name] = this.benchmarkHashFunctions(testCase.data, testCase.iterations);
|
|
610
|
+
// Serialization benchmarks
|
|
611
|
+
report.serialization[testCase.name] = this.benchmarkSerialization(testCase.data, testCase.iterations);
|
|
612
|
+
// Distribution quality tests
|
|
613
|
+
report.distribution[testCase.name] = {};
|
|
614
|
+
const functions = [
|
|
615
|
+
'fnv1a32',
|
|
616
|
+
'xxhash32',
|
|
617
|
+
'murmurHash3_32'
|
|
618
|
+
];
|
|
619
|
+
for (const func of functions){
|
|
620
|
+
report.distribution[testCase.name][func] = this.testHashDistribution(func, testCase.keyGenerator);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return report;
|
|
624
|
+
}
|
|
625
|
+
constructor(){
|
|
626
|
+
this.results = new Map();
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
// Export commonly used combinations
|
|
630
|
+
export const DefaultHashFunction = HighPerformanceHash.xxhash32;
|
|
631
|
+
export const FastHash = HighPerformanceHash.fnv1a32;
|
|
632
|
+
export const QualityHash = HighPerformanceHash.murmurHash3_32;
|