function get_pow(pow_detail, captcha_id, lot_number) {
var n = pow_detail.hashfunc; // 哈希函数名称(例如 "md5", "sha1", "sha256")
var i = pow_detail.version; // 版本信息
var r = pow_detail.bits; // 需要的难度(bit 数)
var s = pow_detail.datetime; // 时间戳
var o = ""; // 额外信息,初始化为空字符串
var a = r % 4; // 计算余数 a
var u = parseInt(r / 4, 10); // 计算商 u
var c = "0".repeat(u); // 生成长度为 u 的“0”字符串
var _ = `${i}|${r}|${n}|${s}|${captcha_id}|${lot_number}|${o}|`; // 构造初始消息字符串
while (1) {
var h = getRandomString(); // 生成随机字符串
var l = _ + h; // 将随机字符串拼接到初始消息字符串之后
var p;
switch (n) {
case "md5":
p = CryptoJS.MD5(l).toString(); // 计算 MD5 哈希
break;
case "sha1":
p = CryptoJS.SHA1(l).toString(); // 计算 SHA1 哈希
break;
case "sha256":
p = CryptoJS.SHA256(l).toString(); // 计算 SHA256 哈希
}
if (a === 0) {
if (p.startsWith(c)) { // 检查哈希是否以 "c" 开头
return JSON.stringify({ "pow_msg": _ + h, "pow_sign": p }); // 返回消息和哈希值
}
} else if (p.startsWith(c)) {
var f;
var d = p[u];
switch (a) {
case 1:
f = 7; // 余数 1 时,f 为 7
break;
case 2:
f = 3; // 余数 2 时,f 为 3
break;
case 3:
f = 1; // 余数 3 时,f 为 1
}
if (d <= f) { // 检查第 u 个字符是否小于等于 f
return JSON.stringify({ "pow_msg": _ + h, "pow_sign": p }); // 返回消息和哈希值
}
}
}
}
// 测试函数
var pow_detail = {
bits: 1,
datetime: "2024-09-01T00:34:37.561483+08:00",
hashfunc: "md5",
version: "1"
}
var captcha_id = "xxxx2bef633eb0264367b3ba9fa1xxxx"
var lot_number = "xxxxf50312c74e9a896ac389fe39xxxx"