@ureq/lib-hash 0.0.3-alpha.0 → 0.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/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # @ureq/lib-hash
2
+
3
+ 哈希工具库,提供请求哈希和字符串哈希功能。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ureq/lib-hash
9
+ # 或
10
+ pnpm add @ureq/lib-hash
11
+ ```
12
+
13
+ > 注意:通常作为 `@ureq/business` 的依赖自动安装,无需单独安装
14
+
15
+ ## 使用
16
+
17
+ ```typescript
18
+ import { generateHash, generateRequestHash } from '@ureq/lib-hash';
19
+
20
+ // 生成字符串哈希
21
+ const hash = generateHash('some-string');
22
+
23
+ // 生成请求哈希
24
+ const requestHash = generateRequestHash(
25
+ 'GET',
26
+ '/api/users',
27
+ null,
28
+ { params: { page: 1 } }
29
+ );
30
+ ```
31
+
32
+ ## API
33
+
34
+ ### generateHash
35
+
36
+ 生成字符串的哈希值。
37
+
38
+ ```typescript
39
+ function generateHash(input: string): string
40
+ ```
41
+
42
+ ### generateRequestHash
43
+
44
+ 生成请求的唯一哈希值。
45
+
46
+ ```typescript
47
+ function generateRequestHash(
48
+ method: string,
49
+ url: string,
50
+ data?: any,
51
+ options?: Record<string, any>
52
+ ): string
53
+ ```
54
+
55
+ ## 功能
56
+
57
+ ### generateRequestHash
58
+
59
+ 生成请求的唯一哈希值,用于:
60
+
61
+ - 请求去重(幂等性保证)
62
+ - 缓存键生成
63
+ - 请求标识
64
+
65
+ ```typescript
66
+ import { generateRequestHash } from '@ureq/lib-hash';
67
+
68
+ const hash1 = generateRequestHash('GET', '/users', null, { params: { page: 1 } });
69
+ const hash2 = generateRequestHash('GET', '/users', null, { params: { page: 1 } });
70
+
71
+ console.log(hash1 === hash2); // true - 相同的请求生成相同的哈希
72
+ ```
73
+
74
+ ### generateHash
75
+
76
+ 生成字符串的哈希值。
77
+
78
+ ```typescript
79
+ import { generateHash } from '@ureq/lib-hash';
80
+
81
+ const hash = generateHash('hello world');
82
+ console.log(hash); // 生成的哈希值
83
+ ```
84
+
85
+ ## 哈希算法
86
+
87
+ 使用简单高效的字符串哈希算法,将输入转换为 32 位整数,然后转换为 36 进制字符串。适用于大多数场景。
88
+
89
+ ## 使用场景
90
+
91
+ ### 请求去重
92
+
93
+ ```typescript
94
+ import { Request } from '@ureq/core';
95
+ import { FetchRequestor } from '@ureq/impl-fetch';
96
+ import { generateRequestHash } from '@ureq/lib-hash';
97
+
98
+ const request = new Request(
99
+ new FetchRequestor(),
100
+ {
101
+ idempotent: {
102
+ getRequestId: (method, url, data, options) => {
103
+ return generateRequestHash(method, url, data, options);
104
+ },
105
+ dedupeTime: 1000
106
+ }
107
+ }
108
+ );
109
+ ```
110
+
111
+ ### 缓存键生成
112
+
113
+ ```typescript
114
+ import { generateRequestHash } from '@ureq/lib-hash';
115
+
116
+ const request = new Request(
117
+ new FetchRequestor(),
118
+ {
119
+ cache: {
120
+ getCacheKey: (url, options) => {
121
+ return generateRequestHash('GET', url, null, options);
122
+ }
123
+ }
124
+ }
125
+ );
126
+ ```
127
+
128
+ ## 文档
129
+
130
+ 查看完整文档:[https://sunny-117.github.io/ureq](https://sunny-117.github.io/ureq)
131
+
132
+ ## License
133
+
134
+ MIT
package/dist/index.js CHANGED
@@ -1,2 +1,26 @@
1
- 'use strict';function i(n){let t=0;for(let r=0;r<n.length;r++){let e=n.charCodeAt(r);t=(t<<5)-t+e,t=t&t;}return t.toString(36)}function g(n,t,r,e){let s=[n.toUpperCase(),t,r?JSON.stringify(r):"",e?JSON.stringify(e):""];return i(s.join("|"))}exports.generateHash=i;exports.generateRequestHash=g;//# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ // src/index.ts
4
+ function generateHash(input) {
5
+ let hash = 0;
6
+ for (let i = 0; i < input.length; i++) {
7
+ const char = input.charCodeAt(i);
8
+ hash = (hash << 5) - hash + char;
9
+ hash = hash & hash;
10
+ }
11
+ return hash.toString(36);
12
+ }
13
+ function generateRequestHash(method, url, data, options) {
14
+ const parts = [
15
+ method.toUpperCase(),
16
+ url,
17
+ data ? JSON.stringify(data) : "",
18
+ options ? JSON.stringify(options) : ""
19
+ ];
20
+ return generateHash(parts.join("|"));
21
+ }
22
+
23
+ exports.generateHash = generateHash;
24
+ exports.generateRequestHash = generateRequestHash;
25
+ //# sourceMappingURL=index.js.map
2
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["generateHash","input","hash","i","char","generateRequestHash","method","url","data","options","parts"],"mappings":"aAAO,SAASA,CAAaC,CAAAA,CAAAA,CAAuB,CAClD,IAAIC,EAAO,CACX,CAAA,IAAA,IAASC,CAAI,CAAA,CAAA,CAAGA,CAAIF,CAAAA,CAAAA,CAAM,MAAQE,CAAAA,CAAAA,EAAAA,CAAK,CACrC,IAAMC,CAAAA,CAAOH,CAAM,CAAA,UAAA,CAAWE,CAAC,CAAA,CAC/BD,CAASA,CAAAA,CAAAA,CAAAA,EAAQ,GAAKA,CAAQE,CAAAA,CAAAA,CAC9BF,CAAOA,CAAAA,CAAAA,CAAOA,EAChB,CACA,OAAOA,CAAAA,CAAK,SAAS,EAAE,CACzB,CAEO,SAASG,CACdC,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACAC,EACQ,CACR,IAAMC,CAAQ,CAAA,CACZJ,CAAO,CAAA,WAAA,EACPC,CAAAA,CAAAA,CACAC,EAAO,IAAK,CAAA,SAAA,CAAUA,CAAI,CAAA,CAAI,EAC9BC,CAAAA,CAAAA,CAAU,IAAK,CAAA,SAAA,CAAUA,CAAO,CAAI,CAAA,EACtC,CACA,CAAA,OAAOT,CAAaU,CAAAA,CAAAA,CAAM,IAAK,CAAA,GAAG,CAAC,CACrC","file":"index.js","sourcesContent":["export function generateHash(input: string): string {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(36);\n}\n\nexport function generateRequestHash(\n method: string,\n url: string,\n data?: any,\n options?: Record<string, any>\n): string {\n const parts = [\n method.toUpperCase(),\n url,\n data ? JSON.stringify(data) : '',\n options ? JSON.stringify(options) : ''\n ];\n return generateHash(parts.join('|'));\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;AAAO,SAAS,aAAa,KAAuB,EAAA;AAClD,EAAA,IAAI,IAAO,GAAA,CAAA;AACX,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,IAAM,MAAA,IAAA,GAAO,KAAM,CAAA,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAS,IAAA,GAAA,CAAA,IAAA,IAAQ,KAAK,IAAQ,GAAA,IAAA;AAC9B,IAAA,IAAA,GAAO,IAAO,GAAA,IAAA;AAAA;AAEhB,EAAO,OAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AACzB;AAEO,SAAS,mBACd,CAAA,MAAA,EACA,GACA,EAAA,IAAA,EACA,OACQ,EAAA;AACR,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,OAAO,WAAY,EAAA;AAAA,IACnB,GAAA;AAAA,IACA,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAI,GAAA,EAAA;AAAA,IAC9B,OAAU,GAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAI,GAAA;AAAA,GACtC;AACA,EAAA,OAAO,YAAa,CAAA,KAAA,CAAM,IAAK,CAAA,GAAG,CAAC,CAAA;AACrC","file":"index.js","sourcesContent":["export function generateHash(input: string): string {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(36);\n}\n\nexport function generateRequestHash(\n method: string,\n url: string,\n data?: any,\n options?: Record<string, any>\n): string {\n const parts = [\n method.toUpperCase(),\n url,\n data ? JSON.stringify(data) : '',\n options ? JSON.stringify(options) : ''\n ];\n return generateHash(parts.join('|'));\n} "]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,23 @@
1
- function i(n){let t=0;for(let r=0;r<n.length;r++){let e=n.charCodeAt(r);t=(t<<5)-t+e,t=t&t;}return t.toString(36)}function g(n,t,r,e){let s=[n.toUpperCase(),t,r?JSON.stringify(r):"",e?JSON.stringify(e):""];return i(s.join("|"))}export{i as generateHash,g as generateRequestHash};//# sourceMappingURL=index.mjs.map
1
+ // src/index.ts
2
+ function generateHash(input) {
3
+ let hash = 0;
4
+ for (let i = 0; i < input.length; i++) {
5
+ const char = input.charCodeAt(i);
6
+ hash = (hash << 5) - hash + char;
7
+ hash = hash & hash;
8
+ }
9
+ return hash.toString(36);
10
+ }
11
+ function generateRequestHash(method, url, data, options) {
12
+ const parts = [
13
+ method.toUpperCase(),
14
+ url,
15
+ data ? JSON.stringify(data) : "",
16
+ options ? JSON.stringify(options) : ""
17
+ ];
18
+ return generateHash(parts.join("|"));
19
+ }
20
+
21
+ export { generateHash, generateRequestHash };
22
+ //# sourceMappingURL=index.mjs.map
2
23
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["generateHash","input","hash","i","char","generateRequestHash","method","url","data","options","parts"],"mappings":"AAAO,SAASA,CAAaC,CAAAA,CAAAA,CAAuB,CAClD,IAAIC,EAAO,CACX,CAAA,IAAA,IAASC,CAAI,CAAA,CAAA,CAAGA,CAAIF,CAAAA,CAAAA,CAAM,MAAQE,CAAAA,CAAAA,EAAAA,CAAK,CACrC,IAAMC,CAAAA,CAAOH,CAAM,CAAA,UAAA,CAAWE,CAAC,CAAA,CAC/BD,CAASA,CAAAA,CAAAA,CAAAA,EAAQ,GAAKA,CAAQE,CAAAA,CAAAA,CAC9BF,CAAOA,CAAAA,CAAAA,CAAOA,EAChB,CACA,OAAOA,CAAAA,CAAK,SAAS,EAAE,CACzB,CAEO,SAASG,CACdC,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACAC,EACQ,CACR,IAAMC,CAAQ,CAAA,CACZJ,CAAO,CAAA,WAAA,EACPC,CAAAA,CAAAA,CACAC,EAAO,IAAK,CAAA,SAAA,CAAUA,CAAI,CAAA,CAAI,EAC9BC,CAAAA,CAAAA,CAAU,IAAK,CAAA,SAAA,CAAUA,CAAO,CAAI,CAAA,EACtC,CACA,CAAA,OAAOT,CAAaU,CAAAA,CAAAA,CAAM,IAAK,CAAA,GAAG,CAAC,CACrC","file":"index.mjs","sourcesContent":["export function generateHash(input: string): string {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(36);\n}\n\nexport function generateRequestHash(\n method: string,\n url: string,\n data?: any,\n options?: Record<string, any>\n): string {\n const parts = [\n method.toUpperCase(),\n url,\n data ? JSON.stringify(data) : '',\n options ? JSON.stringify(options) : ''\n ];\n return generateHash(parts.join('|'));\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAO,SAAS,aAAa,KAAuB,EAAA;AAClD,EAAA,IAAI,IAAO,GAAA,CAAA;AACX,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,IAAM,MAAA,IAAA,GAAO,KAAM,CAAA,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAS,IAAA,GAAA,CAAA,IAAA,IAAQ,KAAK,IAAQ,GAAA,IAAA;AAC9B,IAAA,IAAA,GAAO,IAAO,GAAA,IAAA;AAAA;AAEhB,EAAO,OAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AACzB;AAEO,SAAS,mBACd,CAAA,MAAA,EACA,GACA,EAAA,IAAA,EACA,OACQ,EAAA;AACR,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,OAAO,WAAY,EAAA;AAAA,IACnB,GAAA;AAAA,IACA,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAI,GAAA,EAAA;AAAA,IAC9B,OAAU,GAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAI,GAAA;AAAA,GACtC;AACA,EAAA,OAAO,YAAa,CAAA,KAAA,CAAM,IAAK,CAAA,GAAG,CAAC,CAAA;AACrC","file":"index.mjs","sourcesContent":["export function generateHash(input: string): string {\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(36);\n}\n\nexport function generateRequestHash(\n method: string,\n url: string,\n data?: any,\n options?: Record<string, any>\n): string {\n const parts = [\n method.toUpperCase(),\n url,\n data ? JSON.stringify(data) : '',\n options ? JSON.stringify(options) : ''\n ];\n return generateHash(parts.join('|'));\n} "]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ureq/lib-hash",
3
- "version": "0.0.3-alpha.0",
3
+ "version": "0.0.4",
4
4
  "description": "Hash utilities for universal request library",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -18,6 +18,6 @@
18
18
  "scripts": {
19
19
  "build": "tsup --config tsup.config.ts",
20
20
  "dev": "tsup --config tsup.config.ts --watch",
21
- "test": "vitest"
21
+ "test": "vitest --run"
22
22
  }
23
23
  }