本代码库用以提供常见的 Hash 算法,引自hash-wasm,萌百采用的是4.9.0版本。
为缩小代码长度,萌百仅采用以下算法:
| 算法类型 | 算法名称 | 备注 |
|---|---|---|
| MD5 | MD5 |
- |
| SHA-1 | SHA1 |
- |
| SHA-2 | SHA224、SHA256、SHA384、SHA512 |
该算法的4种变体分别由4种方法实现 |
| SHA-3 | SHA3 |
该算法的4种变体由同一种方法实现,仅在该方法的参数中做区分 |
| SM3 | SM3 |
- |
首先应加载代码库:
await mw.loader.using("ext.gadget.libHashwasm");
此时你可以通过全局变量 hashwasm 来使用本代码库。每种算法名称对应两种方法:
快捷版本指的是直接获取数据的对应 Hash,方法名为算法名称的小写,方法为异步函数,以 SHA-3 为例:
await hashwasm.sha3("MoegirlPedia", 512); // 这里的 sha3 需要小写
// => "d220e77ace317abc0448cb710cd88489e7f86ffaa39700f62032f9be53e851c900d44b79e19d732d4c27bcadb5652c518dd8d948ee8f309aceeee5a43d9e9d19"
需要注意的是,SHA-2 的4种变种分别对应4个方法(hashwasm.sha224、hashwasm.sha256、hashwasm.sha384、hashwasm.sha512),而 SHA-3 的变种通过 hashwasm.sha3 的第二个参数指定(第二个参数仅接受 224 | 256 | 384 | 512,512 为默认值)。
复杂版本需要自行构建对象,但可以提供更强大的控制功能。
使用方法与快捷版本类似,但不同的是方法名为create【算法名称全大写】,以 SHA-3 为例:
const hash = await hashwasm.createSHA3(512); // 注意这里的 SHA3 是大写
hash.init();
hash.update("MoegirlPedia"); // 添加数据,可多次添加,每次添加的数据之间没有间隔符
hash.digest("hex"); // 获取结果,可指定参数为 hex 以获取 16 进制数字,也可指定为 binary 以获取一个 Uint8Array
const state = hash.save(); // 保存当前状态(指当前已经添加的数据)为 Uint8Array【需在 digest 方法执行前】
hash.load(state); // 加载之前保存的状态
hash.blockSize // => 72
digestSize // => 64
需要注意的是,SHA-2 的4种变种分别对应4个方法(hashwasm.createSHA224、hashwasm.createSHA256、hashwasm.createSHA384、hashwasm.createSHA512),而 SHA-3 的变种通过 hashwasm.createSHA3 的第一个参数指定(第一个参数仅接受 224 | 256 | 384 | 512,512 为默认值)。
该代码库使用了WebAssembly.compile和WebAssembly.instantiate,这在 Chrome 57 和 FireFox 52 以上版本可用。