本代码库用以提供常见的 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 以上版本可用。