@sepiariver/unique-set 3.1.1 → 3.1.3

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/index.js CHANGED
@@ -82,20 +82,20 @@ var _shash = (value, hash) => {
82
82
  return hash;
83
83
  }
84
84
  if (value instanceof Map) {
85
- hash = _mix(hash, 17);
86
- const entries = Array.from(value.entries()).sort(
87
- ([a], [b]) => String(a).localeCompare(String(b))
88
- );
89
- for (const [k, v] of entries) {
90
- hash = _shash(k, hash);
91
- hash = _shash(v, hash);
85
+ let mapHash = 0;
86
+ for (const [k, v] of value) {
87
+ let entryHash = _shash(k, 2166136261);
88
+ entryHash = _shash(v, entryHash);
89
+ mapHash = mapHash + entryHash | 0;
92
90
  }
93
- return hash;
91
+ return _mix(hash, mapHash);
94
92
  }
95
93
  if (value instanceof Set) {
96
- hash = _mix(hash, 18);
97
- for (const v of value) hash = _shash(v, hash);
98
- return hash;
94
+ let setHash = 0;
95
+ for (const v of value) {
96
+ setHash = setHash + _shash(v, 2166136261) | 0;
97
+ }
98
+ return _mix(hash, setHash);
99
99
  }
100
100
  if (value instanceof Date) {
101
101
  hash = _mix(hash, 20);
@@ -108,12 +108,15 @@ var _shash = (value, hash) => {
108
108
  return _mixStr(hash, value.toString());
109
109
  }
110
110
  hash = _mix(hash, 19);
111
- const keys = Object.keys(value).sort();
112
- for (const key of keys) {
113
- hash = _mixStr(hash, key);
114
- hash = _shash(value[key], hash);
115
- }
116
- return hash;
111
+ let objHash = 0;
112
+ const keys = Object.keys(value);
113
+ for (let i = 0; i < keys.length; i++) {
114
+ const key = keys[i];
115
+ let pairHash = _mixStr(2166136261, key);
116
+ pairHash = _shash(value[key], pairHash);
117
+ objHash = objHash + pairHash | 0;
118
+ }
119
+ return _mix(hash, objHash);
117
120
  };
118
121
  var MapSet = class {
119
122
  #map;
package/dist/index.mjs CHANGED
@@ -46,20 +46,20 @@ var _shash = (value, hash) => {
46
46
  return hash;
47
47
  }
48
48
  if (value instanceof Map) {
49
- hash = _mix(hash, 17);
50
- const entries = Array.from(value.entries()).sort(
51
- ([a], [b]) => String(a).localeCompare(String(b))
52
- );
53
- for (const [k, v] of entries) {
54
- hash = _shash(k, hash);
55
- hash = _shash(v, hash);
49
+ let mapHash = 0;
50
+ for (const [k, v] of value) {
51
+ let entryHash = _shash(k, 2166136261);
52
+ entryHash = _shash(v, entryHash);
53
+ mapHash = mapHash + entryHash | 0;
56
54
  }
57
- return hash;
55
+ return _mix(hash, mapHash);
58
56
  }
59
57
  if (value instanceof Set) {
60
- hash = _mix(hash, 18);
61
- for (const v of value) hash = _shash(v, hash);
62
- return hash;
58
+ let setHash = 0;
59
+ for (const v of value) {
60
+ setHash = setHash + _shash(v, 2166136261) | 0;
61
+ }
62
+ return _mix(hash, setHash);
63
63
  }
64
64
  if (value instanceof Date) {
65
65
  hash = _mix(hash, 20);
@@ -72,12 +72,15 @@ var _shash = (value, hash) => {
72
72
  return _mixStr(hash, value.toString());
73
73
  }
74
74
  hash = _mix(hash, 19);
75
- const keys = Object.keys(value).sort();
76
- for (const key of keys) {
77
- hash = _mixStr(hash, key);
78
- hash = _shash(value[key], hash);
79
- }
80
- return hash;
75
+ let objHash = 0;
76
+ const keys = Object.keys(value);
77
+ for (let i = 0; i < keys.length; i++) {
78
+ const key = keys[i];
79
+ let pairHash = _mixStr(2166136261, key);
80
+ pairHash = _shash(value[key], pairHash);
81
+ objHash = objHash + pairHash | 0;
82
+ }
83
+ return _mix(hash, objHash);
81
84
  };
82
85
  var MapSet = class {
83
86
  #map;
package/index.ts CHANGED
@@ -56,20 +56,20 @@ const _shash = (value: unknown, hash: number): number => {
56
56
  return hash;
57
57
  }
58
58
  if (value instanceof Map) {
59
- hash = _mix(hash, 0x11);
60
- const entries = Array.from(value.entries()).sort(([a], [b]) =>
61
- String(a).localeCompare(String(b))
62
- );
63
- for (const [k, v] of entries) {
64
- hash = _shash(k, hash);
65
- hash = _shash(v, hash);
59
+ let mapHash = 0;
60
+ for (const [k, v] of value) {
61
+ let entryHash = _shash(k, 0x811c9dc5);
62
+ entryHash = _shash(v, entryHash);
63
+ mapHash = (mapHash + entryHash) | 0; // order-independent hash by summing entry hashes (32-bit)
66
64
  }
67
- return hash;
65
+ return _mix(hash, mapHash);
68
66
  }
69
67
  if (value instanceof Set) {
70
- hash = _mix(hash, 0x12);
71
- for (const v of value) hash = _shash(v, hash);
72
- return hash;
68
+ let setHash = 0;
69
+ for (const v of value) {
70
+ setHash = (setHash + _shash(v, 0x811c9dc5)) | 0; // order-independent hash by summing element hashes (32-bit)
71
+ }
72
+ return _mix(hash, setHash);
73
73
  }
74
74
  if (value instanceof Date) {
75
75
  hash = _mix(hash, 0x14);
@@ -82,14 +82,18 @@ const _shash = (value: unknown, hash: number): number => {
82
82
  return _mixStr(hash, value.toString());
83
83
  }
84
84
 
85
- // Plain object — sort keys for order-independence
85
+ // Plain object: order-independent
86
86
  hash = _mix(hash, 0x13);
87
- const keys = Object.keys(value as object).sort();
88
- for (const key of keys) {
89
- hash = _mixStr(hash, key);
90
- hash = _shash((value as Record<string, unknown>)[key], hash);
87
+ let objHash = 0;
88
+ const keys = Object.keys(value as object);
89
+ for (let i = 0; i < keys.length; i++) {
90
+ const key = keys[i]!;
91
+ let pairHash = _mixStr(0x811c9dc5, key);
92
+ pairHash = _shash((value as Record<string, unknown>)[key], pairHash);
93
+ objHash = (objHash + pairHash) | 0;
91
94
  }
92
- return hash;
95
+
96
+ return _mix(hash, objHash);
93
97
  };
94
98
 
95
99
  export class MapSet<T> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sepiariver/unique-set",
3
- "version": "3.1.1",
3
+ "version": "3.1.3",
4
4
  "description": "A Set-like collection that deduplicates by deep value equality using a streaming structural hash and fast-deep-equal.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",