HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Transfer-Encoding: chunked
Date: Thu, 21 Nov 2024 10:30:10 GMT
Connection: close
2000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link href="/css/peimei.css" rel="stylesheet" type="text/css" />
<title>Title</title>
<script>
function generateKey() {
function random(min, max) {
let n = max - min + 1
return Math.ceil((Math.random() * n)) - 1 + min
}
function randomString(length) {
let r = ''
for (let i = 0; i < length; i++) {
r += random(0, 15).toString(16)
}
return r
}
function calcFF(x) {
/*
计算所有可能 取一种 概率准 效率高
当 y ∈ [0, 100)
则 (100x + y) % 97 = 1
y % 97 = 97 - 100x % 97 + 1
y % 97 = 98 - 100x % 97
y = a * 97 + (98 - 100x % 97)
∵ y ∈ [0, 100) , 98 - 100x % 97 ∈ [2, 98]
∴ 当 98 - 100x % 97 <= 2 时 a ∈ [0, 1]
当 98 > 98 - 100x % 97 > 2 时 a = 0
当 98 - 100x % 97 = 98 时 a ∈ [-1, 0]
∵ y < 100
∴ 当 98 - 100x % 97 <= 2 的时候 y的最小值为 98 - 100x % 97
当 98 > 98 - 100x % 97 > 2 的时候 y的最小值也为 98 - 100x % 97
当 98 - 100x % 97 = 98 的时候 y的最小值为 1
∴ 当 98 > 98 - 100x % 97 的时候 y的最小值为 98 - 100x % 97
当 98 = 98 - 100x % 97 的时候 y的最小值为 1
当 y ∈ [100, 255]
则 (1000x + y) % 97 = 1
y % 97 = 97 - 1000x % 97 + 1
y % 97 = 98 - 1000x % 97
y = a * 97 + (98 - 1000x % 97)
∵ y ∈ [100, 255] , 98 - 1000x % 97 ∈ [2, 98]
∴ 98 - 1000x % 97 < 3 时 a = 2
3 <= 98 - 1000x % 97 <= 61 时 a ∈ [1, 2]
∵ y 的最大值肯定 > 100
∴ 当 98 - 1000x % 97 < 3 时 y 的最大值为 98 - 1000x % 97 + 97 * 2
当 98 - 1000x % 97 > 61 时 y 的最大值为 98 - 1000x % 97 + 97 * 1
当 3 <= 98 - 1000x % 97 <= 61 时 y 的最大值为 98 - 1000x % 97 + 97 * 2
∴ 当 98 - 1000x % 97 <= 61 时 y 的最大值为 98 - 1000x % 97 + 97 * 2
当 98 - 1000x % 97 > 61 时 y 的最大值为 98 - 1000x % 97 + 97 * 1
*/
let min, max, ys = [],
y
if (98 - 100 * x % 97 === 98) {
min = 1
} else {
min = 98 - 100 * x % 97
}
if (98 - 1000 * x % 97 > 61) {
max = 98 - 1000 * x % 97 + 97 * 1
} else {
max = 98 - 1000 * x % 97 + 97 * 2
}
let i = 0
do {
ys.push(max - i * 97)
i++
} while (max - i * 97 >= 100)
if (min + 97 < 100) {
ys.push(min + 97)
}
ys.push(min)
y = ys[random(0, ys.length - 1)]
return y.toString(16).padStart(2, '0')
}
function calcFF_2(x) {
/*
//这个方法概率不准 因为只是简单的假设y 并没有由x推导 效率高
若要使 0 <= y < 100
则 (100x + y) % 97 = 1
y % 97 = 97 - 100x % 97 + 1
y % 97 = 98 - 100x % 97
y = a * 97 + (98 - 100x % 97)
∵ y ∈ [0, 100) , 98 - 100x % 97 ∈ [2, 98]
∴ 当 98 - 100x % 97 <= 2 时 a ∈ [0, 1]
当 98 > 98 - 100x % 97 > 2 时 a = 0
当 98 - 100x % 97 = 98 时 a ∈ [-1, 0]
若要使 100 <= y <= 255
则 (1000x + y) % 97 = 1
y % 97 = 97 - 1000x % 97 + 1
y % 97 = 98 - 1000x % 97
y = a * 97 + (98 - 1000x % 97)
∵ y ∈ [100, 255] , 98 - 1000x % 97 ∈ [2, 98]
∴ 98 - 1000x % 97 < 3 时 a = 2
3 <= 98 - 1000x % 97 <= 61 时 a ∈ [1, 2]
*/
let y = 0
if (random(0, 255) < 100) {
let z = 98 - 100 * x % 97
if (z <= 2) {
y = random(0, 1) * 97 + z
} else if (z == 98) {
y = random(-1, 0) * 97 + z
} else {
y = z
}
} else {
let z = 98 - 1000 * x % 97
if (z < 3) {
y = 2 * 97 + z
} else if (z > 61) {
y = 97 + z
} else {
y = random(1, 2) * 97 + z
}
}
return y.toString(16).padStart(2, '0')
}
function calcFF_3(x) {
/*
取所有可能一个个随机试 效率最差 但是实现最简单 效率低100倍
*/
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250,
251, 252, 253, 254, 255
]
let y
do {
let i = random(0, arr.length - 1)
y = arr.splice(i, 1)[0]
} while (((y > 100 ? (1000 * x) : (100 * x)) + y) % 97 !== 1)
return y.toString(16).padStart(2, '0')
}
function build(day = 365) {
//根据验证需求 day需小于 45000
//随机生成的 1-6 9-14 17-18 位 除了第二位为时间因数 其他数字可自定义 成为用户信息标识符
for (let i = 0; i < 3; i++) {
if (i === 0) {
//第 1-6 位任意 第二位为时间校验码的因数
v = randomString(6)
//第 1-6 位与第 7-8 位 各自转成十进制再转成字符串相连转整数 需要能被97除余1
//取 7-8 位
v += calcFF(parseInt(v.substr(0, 6), 16))
} else if (i === 1) {
//第 9-14 位随机
eb0
生成
v += randomString(6)
//第 7-14 位与第 15-16 位 各自转成十进制再转成字符串相连转整数 需要能被97除余1
//取 15-16 位
v += calcFF(parseInt(v.substr(6, 8), 16))
} else {
//第 17-18 位随机生成
v += randomString(2)
//第 19-23 位时间校验码
//当前时间戳的天数 + 有效天数 乘以第2位校验因数 如果为0 就乘以9 转16进制
let n = (parseInt((new Date()) / 8.64e7) + day) * (parseInt(v.substr(1, 1), 16) || 9)
if (n > parseInt('fffff', 16)) {
//如果时间校验码超过五位 为错误
//理论上不可能 就算有效期至100年以后因数取最大都不会超过这个数
return ""
}
v += n.toString(16).padStart(5, '0')
//第 15-23 位与第 24-25 位各自转成十进制再转成字符串相连转整数 需要能被97除余1
//取 24-25 位
v += calcFF(parseInt(v.substr(14, 9), 16))
}
}
let r = []
for (let i = 0; i < 5; i++) {
r.push(v.substr(i * 5, 5))
}
return r.join('-')
}
function _checkKeySchema(v) {
//验证有效性
let p = 0;
if (v.length !== 25) {
return false;
}
for (let item of [
[0, 6, 6],
[6, 8, 14],
[14, 9, 23]
]) {
if (parseInt(parseInt(v.substr(item[0], item[1]), 16) + String(parseInt(v.substr(item[2], 2), 16)).padStart(
2, '0')) % 97 !== 1) {
return false
}
}
return true
}
function _extractTime(v) {
//获取有效期时间戳
return parseInt(v.substr(18, 5), 16) / (parseInt(v.substr(1, 1), 16) || 9)
}
function vaild(k) {
//验证函数
let v = k.replace(/\-/g, '')
let keyGenTime = _extractTime(v)
if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {
return false
}
let releaseTime = Math.floor((new Date()) / 8.64e7)
if (releaseTime > keyGenTime + 1) {
return false
}
return _checkKeySchema(v)
}
return build()
}
for (let i = 0; i < 10; i++) {
console.log('licenseKey-' + (i + 1) + ': ', generateKey())
}
</script>
</head>
<body>
<table>
<caption>American Film Institute’s Top Five Films</caption>
<thead>
<tr>
<th>Position
<th>Movie
<th>Year of Release
</thead>
<tbody>
<tr>
<td>1
<td>Citizen Kane
<td>1941
<tr>
<td>2
<td>The Godfather
<td>1972
<tr>
<td>3
<td>Casablanca
<td>1942
<tr>
<td>4
<td>Raging Bull
<td>1980
<tr>
<td>5
<td>Singin’ In The Rain
<td>1952
</tbody>
</table>
</body>
</html>
0
{
"@category" : "datascan",
"@timestamp" : "2024-11-21T10:23:17.000Z",
"app" : {
"http" : {
"bodymd5" : "013c1be632eaed95f3c4f69bc18e19e0",
"bodymmh3" : -1169547090,
"headermd5" : "a4c0576426e26bb4322a350674d1ad20",
"headermmh3" : -1665401312,
"title" : "Title"
},
"length" : 12137
},
"asn" : "AS4134",
"country" : "CN",
"data" : "HTTP/1.1 200 \r\nContent-Type: text/html;charset=UTF-8\r\nContent-Language: en-US\r\nTransfer-Encoding: chunked\r\nDate: Thu, 21 Nov 2024 10:30:10 GMT\r\nConnection: close\r\n\r\n2000\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <link href=\"/css/peimei.css\" rel=\"stylesheet\" type=\"text/css\" />\r\n <title>Title</title>\r\n <script>\r\n function generateKey() {\r\n\r\n function random(min, max) {\r\n let n = max - min + 1\r\n return Math.ceil((Math.random() * n)) - 1 + min\r\n }\r\n\r\n\r\n function randomString(length) {\r\n let r = ''\r\n for (let i = 0; i < length; i++) {\r\n r += random(0, 15).toString(16)\r\n }\r\n return r\r\n }\r\n\r\n function calcFF(x) {\r\n /*\r\n \u8ba1\u7b97\u6240\u6709\u53ef\u80fd \u53d6\u4e00\u79cd \u6982\u7387\u51c6 \u6548\u7387\u9ad8\r\n \u5f53 y \u2208 [0, 100)\r\n \u5219 (100x + y) % 97 = 1\r\n y % 97 = 97 - 100x % 97 + 1\r\n y % 97 = 98 - 100x % 97\r\n y = a * 97 + (98 - 100x % 97)\r\n \u2235 y \u2208 [0, 100) , 98 - 100x % 97 \u2208 [2, 98]\r\n \u2234 \u5f53 98 - 100x % 97 <= 2 \u65f6 a \u2208 [0, 1]\r\n \u5f53 98 > 98 - 100x % 97 > 2 \u65f6 a = 0\r\n \u5f53 98 - 100x % 97 = 98 \u65f6 a \u2208 [-1, 0]\r\n \u2235 y < 100\r\n \u2234 \u5f53 98 - 100x % 97 <= 2 \u7684\u65f6\u5019 y\u7684\u6700\u5c0f\u503c\u4e3a 98 - 100x % 97\r\n \u5f53 98 > 98 - 100x % 97 > 2 \u7684\u65f6\u5019 y\u7684\u6700\u5c0f\u503c\u4e5f\u4e3a 98 - 100x % 97\r\n \u5f53 98 - 100x % 97 = 98 \u7684\u65f6\u5019 y\u7684\u6700\u5c0f\u503c\u4e3a 1\r\n \u2234 \u5f53 98 > 98 - 100x % 97 \u7684\u65f6\u5019 y\u7684\u6700\u5c0f\u503c\u4e3a 98 - 100x % 97\r\n \u5f53 98 = 98 - 100x % 97 \u7684\u65f6\u5019 y\u7684\u6700\u5c0f\u503c\u4e3a 1\r\n \u5f53 y \u2208 [100, 255]\r\n \u5219 (1000x + y) % 97 = 1\r\n y % 97 = 97 - 1000x % 97 + 1\r\n y % 97 = 98 - 1000x % 97\r\n y = a * 97 + (98 - 1000x % 97)\r\n \u2235 y \u2208 [100, 255] , 98 - 1000x % 97 \u2208 [2, 98]\r\n \u2234 98 - 1000x % 97 < 3 \u65f6 a = 2\r\n 3 <= 98 - 1000x % 97 <= 61 \u65f6 a \u2208 [1, 2]\r\n \u2235 y \u7684\u6700\u5927\u503c\u80af\u5b9a > 100\r\n \u2234 \u5f53 98 - 1000x % 97 < 3 \u65f6 y \u7684\u6700\u5927\u503c\u4e3a 98 - 1000x % 97 + 97 * 2\r\n \u5f53 98 - 1000x % 97 > 61 \u65f6 y \u7684\u6700\u5927\u503c\u4e3a 98 - 1000x % 97 + 97 * 1\r\n \u5f53 3 <= 98 - 1000x % 97 <= 61 \u65f6 y \u7684\u6700\u5927\u503c\u4e3a 98 - 1000x % 97 + 97 * 2\r\n \u2234 \u5f53 98 - 1000x % 97 <= 61 \u65f6 y \u7684\u6700\u5927\u503c\u4e3a 98 - 1000x % 97 + 97 * 2\r\n \u5f53 98 - 1000x % 97 > 61 \u65f6 y \u7684\u6700\u5927\u503c\u4e3a 98 - 1000x % 97 + 97 * 1\r\n */\r\n\r\n let min, max, ys = [],\r\n y\r\n\r\n if (98 - 100 * x % 97 === 98) {\r\n min = 1\r\n } else {\r\n min = 98 - 100 * x % 97\r\n }\r\n\r\n if (98 - 1000 * x % 97 > 61) {\r\n max = 98 - 1000 * x % 97 + 97 * 1\r\n } else {\r\n max = 98 - 1000 * x % 97 + 97 * 2\r\n }\r\n\r\n let i = 0\r\n\r\n do {\r\n ys.push(max - i * 97)\r\n i++\r\n } while (max - i * 97 >= 100)\r\n\r\n\r\n if (min + 97 < 100) {\r\n ys.push(min + 97)\r\n }\r\n ys.push(min)\r\n\r\n y = ys[random(0, ys.length - 1)]\r\n\r\n return y.toString(16).padStart(2, '0')\r\n }\r\n\r\n function calcFF_2(x) {\r\n\r\n /*\r\n //\u8fd9\u4e2a\u65b9\u6cd5\u6982\u7387\u4e0d\u51c6 \u56e0\u4e3a\u53ea\u662f\u7b80\u5355\u7684\u5047\u8bbey \u5e76\u6ca1\u6709\u7531x\u63a8\u5bfc \u6548\u7387\u9ad8\r\n \u82e5\u8981\u4f7f 0 <= y < 100\r\n \u5219 (100x + y) % 97 = 1\r\n y % 97 = 97 - 100x % 97 + 1\r\n y % 97 = 98 - 100x % 97\r\n y = a * 97 + (98 - 100x % 97)\r\n \u2235 y \u2208 [0, 100) , 98 - 100x % 97 \u2208 [2, 98]\r\n \u2234 \u5f53 98 - 100x % 97 <= 2 \u65f6 a \u2208 [0, 1]\r\n \u5f53 98 > 98 - 100x % 97 > 2 \u65f6 a = 0\r\n \u5f53 98 - 100x % 97 = 98 \u65f6 a \u2208 [-1, 0]\r\n \u82e5\u8981\u4f7f 100 <= y <= 255\r\n \u5219 (1000x + y) % 97 = 1\r\n y % 97 = 97 - 1000x % 97 + 1\r\n y % 97 = 98 - 1000x % 97\r\n y = a * 97 + (98 - 1000x % 97)\r\n \u2235 y \u2208 [100, 255] , 98 - 1000x % 97 \u2208 [2, 98]\r\n \u2234 98 - 1000x % 97 < 3 \u65f6 a = 2\r\n 3 <= 98 - 1000x % 97 <= 61 \u65f6 a \u2208 [1, 2]\r\n */\r\n\r\n let y = 0\r\n\r\n if (random(0, 255) < 100) {\r\n let z = 98 - 100 * x % 97\r\n if (z <= 2) {\r\n y = random(0, 1) * 97 + z\r\n } else if (z == 98) {\r\n y = random(-1, 0) * 97 + z\r\n } else {\r\n y = z\r\n }\r\n } else {\r\n let z = 98 - 1000 * x % 97\r\n if (z < 3) {\r\n y = 2 * 97 + z\r\n } else if (z > 61) {\r\n y = 97 + z\r\n } else {\r\n y = random(1, 2) * 97 + z\r\n }\r\n }\r\n return y.toString(16).padStart(2, '0')\r\n }\r\n\r\n function calcFF_3(x) {\r\n /*\r\n \u53d6\u6240\u6709\u53ef\u80fd\u4e00\u4e2a\u4e2a\u968f\u673a\u8bd5 \u6548\u7387\u6700\u5dee \u4f46\u662f\u5b9e\u73b0\u6700\u7b80\u5355 \u6548\u7387\u4f4e100\u500d\r\n */\r\n let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\r\n 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,\r\n 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,\r\n 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,\r\n 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,\r\n 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,\r\n 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,\r\n 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,\r\n 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,\r\n 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,\r\n 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250,\r\n 251, 252, 253, 254, 255\r\n ]\r\n let y\r\n do {\r\n let i = random(0, arr.length - 1)\r\n y = arr.splice(i, 1)[0]\r\n } while (((y > 100 ? (1000 * x) : (100 * x)) + y) % 97 !== 1)\r\n return y.toString(16).padStart(2, '0')\r\n }\r\n\r\n function build(day = 365) {\r\n //\u6839\u636e\u9a8c\u8bc1\u9700\u6c42 day\u9700\u5c0f\u4e8e 45000\r\n //\u968f\u673a\u751f\u6210\u7684 1-6 9-14 17-18 \u4f4d \u9664\u4e86\u7b2c\u4e8c\u4f4d\u4e3a\u65f6\u95f4\u56e0\u6570 \u5176\u4ed6\u6570\u5b57\u53ef\u81ea\u5b9a\u4e49 \u6210\u4e3a\u7528\u6237\u4fe1\u606f\u6807\u8bc6\u7b26\r\n for (let i = 0; i < 3; i++) {\r\n if (i === 0) {\r\n //\u7b2c 1-6 \u4f4d\u4efb\u610f \u7b2c\u4e8c\u4f4d\u4e3a\u65f6\u95f4\u6821\u9a8c\u7801\u7684\u56e0\u6570\r\n v = randomString(6)\r\n\r\n //\u7b2c 1-6 \u4f4d\u4e0e\u7b2c 7-8 \u4f4d \u5404\u81ea\u8f6c\u6210\u5341\u8fdb\u5236\u518d\u8f6c\u6210\u5b57\u7b26\u4e32\u76f8\u8fde\u8f6c\u6574\u6570 \u9700\u8981\u80fd\u88ab97\u9664\u4f591\r\n\r\n //\u53d6 7-8 \u4f4d\r\n v += calcFF(parseInt(v.substr(0, 6), 16))\r\n } else if (i === 1) {\r\n //\u7b2c 9-14 \u4f4d\u968f\u673a\r\neb0\r\n\u751f\u6210\r\n v += randomString(6)\r\n //\u7b2c 7-14 \u4f4d\u4e0e\u7b2c 15-16 \u4f4d \u5404\u81ea\u8f6c\u6210\u5341\u8fdb\u5236\u518d\u8f6c\u6210\u5b57\u7b26\u4e32\u76f8\u8fde\u8f6c\u6574\u6570 \u9700\u8981\u80fd\u88ab97\u9664\u4f591\r\n\r\n //\u53d6 15-16 \u4f4d\r\n v += calcFF(parseInt(v.substr(6, 8), 16))\r\n } else {\r\n //\u7b2c 17-18 \u4f4d\u968f\u673a\u751f\u6210\r\n v += randomString(2)\r\n\r\n //\u7b2c 19-23 \u4f4d\u65f6\u95f4\u6821\u9a8c\u7801\r\n //\u5f53\u524d\u65f6\u95f4\u6233\u7684\u5929\u6570 + \u6709\u6548\u5929\u6570 \u4e58\u4ee5\u7b2c2\u4f4d\u6821\u9a8c\u56e0\u6570 \u5982\u679c\u4e3a0 \u5c31\u4e58\u4ee59 \u8f6c16\u8fdb\u5236\r\n let n = (parseInt((new Date()) / 8.64e7) + day) * (parseInt(v.substr(1, 1), 16) || 9)\r\n if (n > parseInt('fffff', 16)) {\r\n //\u5982\u679c\u65f6\u95f4\u6821\u9a8c\u7801\u8d85\u8fc7\u4e94\u4f4d \u4e3a\u9519\u8bef\r\n //\u7406\u8bba\u4e0a\u4e0d\u53ef\u80fd \u5c31\u7b97\u6709\u6548\u671f\u81f3100\u5e74\u4ee5\u540e\u56e0\u6570\u53d6\u6700\u5927\u90fd\u4e0d\u4f1a\u8d85\u8fc7\u8fd9\u4e2a\u6570\r\n return \"\"\r\n }\r\n v += n.toString(16).padStart(5, '0')\r\n\r\n //\u7b2c 15-23 \u4f4d\u4e0e\u7b2c 24-25 \u4f4d\u5404\u81ea\u8f6c\u6210\u5341\u8fdb\u5236\u518d\u8f6c\u6210\u5b57\u7b26\u4e32\u76f8\u8fde\u8f6c\u6574\u6570 \u9700\u8981\u80fd\u88ab97\u9664\u4f591\r\n\r\n //\u53d6 24-25 \u4f4d\r\n v += calcFF(parseInt(v.substr(14, 9), 16))\r\n }\r\n }\r\n let r = []\r\n for (let i = 0; i < 5; i++) {\r\n r.push(v.substr(i * 5, 5))\r\n }\r\n return r.join('-')\r\n }\r\n\r\n function _checkKeySchema(v) {\r\n //\u9a8c\u8bc1\u6709\u6548\u6027\r\n let p = 0;\r\n if (v.length !== 25) {\r\n return false;\r\n }\r\n for (let item of [\r\n [0, 6, 6],\r\n [6, 8, 14],\r\n [14, 9, 23]\r\n ]) {\r\n if (parseInt(parseInt(v.substr(item[0], item[1]), 16) + String(parseInt(v.substr(item[2], 2), 16)).padStart(\r\n 2, '0')) % 97 !== 1) {\r\n\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n function _extractTime(v) {\r\n //\u83b7\u53d6\u6709\u6548\u671f\u65f6\u95f4\u6233\r\n return parseInt(v.substr(18, 5), 16) / (parseInt(v.substr(1, 1), 16) || 9)\r\n }\r\n\r\n function vaild(k) {\r\n //\u9a8c\u8bc1\u51fd\u6570\r\n let v = k.replace(/\\-/g, '')\r\n let keyGenTime = _extractTime(v)\r\n if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {\r\n return false\r\n }\r\n let releaseTime = Math.floor((new Date()) / 8.64e7)\r\n if (releaseTime > keyGenTime + 1) {\r\n return false\r\n }\r\n return _checkKeySchema(v)\r\n }\r\n return build()\r\n\r\n }\r\n\r\n for (let i = 0; i < 10; i++) {\r\n console.log('licenseKey-' + (i + 1) + ': ', generateKey())\r\n }\r\n </script>\r\n</head>\r\n<body>\r\n<table>\r\n <caption>American Film Institute\u2019s Top Five Films</caption>\r\n <thead>\r\n <tr>\r\n <th>Position\r\n <th>Movie\r\n <th>Year of Release\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td>1\r\n <td>Citizen Kane\r\n <td>1941\r\n <tr>\r\n <td>2\r\n <td>The Godfather\r\n <td>1972\r\n <tr>\r\n <td>3\r\n <td>Casablanca\r\n <td>1942\r\n <tr>\r\n <td>4\r\n <td>Raging Bull\r\n <td>1980\r\n <tr>\r\n <td>5\r\n <td>Singin\u2019 In The Rain\r\n <td>1952\r\n </tbody>\r\n</table>\r\n</body>\r\n</html>\r\n0\r\n\r\n",
"datamd5" : "411b72f429628bd272a2e8186b9d198b",
"datammh3" : -555499076,
"device" : {
"class" : "<enterprise field>: device.class"
},
"domain" : [
"163data.com.cn"
],
"geolocus" : {
"asn" : "AS4134",
"continent" : "AS",
"continentname" : "Asia",
"country" : "CN",
"countryname" : "China",
"domain" : [
"163data.com.cn",
"chinatelecom.cn"
],
"isineu" : "false",
"latitude" : "35.86166",
"location" : "35.86166,104.195397",
"longitude" : "104.195397",
"netname" : "CHINANET-NM",
"organization" : "CHINANET neimeng province network",
"subnet" : "222.74.0.0/16"
},
"host" : [
68
],
"hostname" : [
"68.86.74.222.broad.wh.nm.dynamic.163data.com.cn"
],
"ip" : "222.74.86.68",
"ipv6" : "false",
"latitude" : "34.7732",
"location" : "34.7732,113.7220",
"longitude" : "113.7220",
"node" : {
"country" : "<enterprise field>: node.country",
"groupid" : "<enterprise field>: node.groupid",
"id" : "<enterprise field>: node.id",
"physicalcountry" : "<enterprise field>: node.physicalcountry"
},
"organization" : "Chinanet",
"os" : "Windows",
"osvendor" : "Microsoft",
"port" : 1515,
"protocol" : "http",
"protocolversion" : "1.1",
"reverse" : [
"68.86.74.222.broad.wh.nm.dynamic.163data.com.cn"
],
"seen_date" : "2024-11-21",
"source" : "datascan",
"status" : 200,
"subdomains" : [
"86.74.222.broad.wh.nm.dynamic.163data.com.cn",
"222.broad.wh.nm.dynamic.163data.com.cn",
"nm.dynamic.163data.com.cn",
"broad.wh.nm.dynamic.163data.com.cn",
"dynamic.163data.com.cn",
"74.222.broad.wh.nm.dynamic.163data.com.cn",
"wh.nm.dynamic.163data.com.cn"
],
"subnet" : "222.74.0.0/15",
"tld" : [
"com.cn"
],
"tls" : "false",
"transport" : "tcp",
"url" : "/"
}