@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 +134 -0
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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';
|
|
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":[
|
|
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
|
-
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[
|
|
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
|
+
"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
|
}
|