设计一个简单的[JS]文本摘要算法
引
网站cookie中有一段用户信息(包括微信用户信息,用户关联信息)的文本,使用entrance
键存储,选择不同的条件后文本内容也不同,cookie上的值也会变化。本来的打算是通过将entrance
值存储在sessionstorage,然后通过比较当前请求中cookie的值与sessionstorage的值是否一致来得出用户是否选择了其他条件从而进行其他操作。
但是不想将entrance
键的值直接存储到sessionstorage中,一来该值内容较长,基本上超过1000个字符,二来只是为了进行比较操作就存储原始的用户信息做法不是很友好。
所以想要一个简单的文本摘要算法,以达到上述诉求。在网络上搜索了一番,并没有一个零依赖,简单的文本摘要算法。只好自己理了下思路写出了一个简单的文本摘要算法。分享出来,以飨读者。
正
/**
* 简单的文本摘要算法。
* ! 不要用于敏感业务
* @param {String} text 待摘要的文本,必需
* @param {String} salt 加盐内容
* @param {Number} caesar 凯撒字符偏移长度
* @param {Object} opts 其他配置项
* @property {Number} opts.blockLength 分块长度
*/
export default function textSummary(
text = "",
salt = "[简单]文本摘要算法",
caesar = 5,
opts = {}
) {
if (typeof text !== "string") {
throw new Error("entrance value must be a string");
}
const { blockLength = 16 } = opts;
if (blockLength >= 36 || blockLength < 16) {
throw new Error(
"blockLength options prop is wrong value, it is value in range:16~36"
);
}
// 加盐
const textArr = `${text};salt=${salt}`.split("");
const _0bTextArr = textArr
.map(str => str.codePointAt(0) + caesar) // 凯撒字符偏移
.map(num => num.toString(2)); // 转化为二进制
// 分块
const _0bTextStr = _0bTextArr.join("");
const blockAmount = Math.ceil(_0bTextStr.length / blockLength);
const _0bTextBlockArr = Array(blockAmount);
for (let i = 0; i < blockAmount; i++) {
let subStr = _0bTextStr.slice(i * blockLength, (i + 1) * blockLength);
// 最后一块字符长度不足,补0
if (subStr.length !== blockLength) {
subStr = subStr.padEnd(blockLength, "0");
}
_0bTextBlockArr[i] = subStr;
}
// 将二进制块转化为16进制块
const _0xTextBlockArr = _0bTextBlockArr.map(str =>
parseInt(str, 2).toString(blockLength)
);
const result = _0xTextBlockArr.join("");
return result;
}
释
算法设计思路是:
- 对原始文本进行加盐处理。
- 获取到处理后文本的Unicode字符码点位置,并将获取到的位置进行凯撒字符偏移处理。
- 将偏移后的位置(为十进制的结果)转化为二进制。
- 对整个二进制文本按指定的块长度进行分块处理。最后一块内容如果字符长度不足,则补0。
- 将分好的每个块的二进制内容转为十六进制内容。
- 将得到的每个块的十六进制内容拼接在一起并返回其值。
思考了下,由于在步骤4对最后一块内容进行了补0操作,导致该块内容在逆处理时得不到肯定的值,从而导致算法不可逆。
本算法虽说是摘要算法,但实质上有加密,线性压缩的一点功能。但还好已经满足了原本的要求。
标签:
文本摘要算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2016-10-29 FCC参阅笔记之编程知识点(上)