[{"data":1,"prerenderedAt":2913},["ShallowReactive",2],{"blog-list-zh":3},[4,498,930,1251,1780,2162,2511,2690],{"id":5,"title":6,"author":7,"body":8,"description":481,"draft":482,"extension":483,"lang":484,"meta":485,"navigation":486,"path":487,"pubDate":488,"relatedTool":489,"seo":490,"stem":491,"tags":492,"__hash__":497},"blog\u002Fblog\u002Fzh-unix-timestamp-converter-guide.mdx","Unix 时间戳转换器：是什么以及如何使用","ujiffy team",{"type":9,"value":10,"toc":471},"minimark",[11,25,28,33,47,54,63,67,70,92,103,109,112,116,123,129,139,153,159,165,168,171,251,254,259,270,274,279,282,336,339,362,367,369,406,408,423,426,429,446,449,452,455,464,467],[12,13,14,15,19,20,24],"p",{},"翻日志的时候，你有没有遇到过像 ",[16,17,18],"code",{},"1715760000"," 这样的数字？乍看像是乱码，但其实它精确地表示了某一个时间点——这就是 ",[21,22,23],"strong",{},"Unix 时间戳","。",[12,26,27],{},"这篇文章帮你彻底搞清楚 Unix 时间戳是什么、开发者为什么喜欢用它，以及如何快速将时间戳转换成你能看懂的日期。",[29,30,32],"h2",{"id":31},"unix-时间戳是什么","Unix 时间戳是什么？",[12,34,35,36,39,40,43,44,24],{},"Unix 时间戳（也叫 ",[21,37,38],{},"epoch time","）是从 ",[21,41,42],{},"1970 年 1 月 1 日 00:00:00 UTC"," 开始，累计经过的",[21,45,46],{},"秒数",[12,48,49,50,53],{},"这个起点——1970 年元旦的 UTC 午夜——叫做 ",[21,51,52],{},"Unix 纪元（Unix Epoch）","，是随 Unix 操作系统诞生而定下的约定，沿用至今。",[12,55,56,57,59,60,24],{},"所以 ",[16,58,18],{}," 的意思是：从 Unix 纪元开始，过了 17 亿 1576 万秒——换算成日历时间，就是 ",[21,61,62],{},"2025 年 5 月 15 日 08:00:00 UTC",[29,64,66],{"id":65},"秒级-vs-毫秒级一个常见陷阱","秒级 vs 毫秒级，一个常见陷阱",[12,68,69],{},"不同系统的时间戳精度不一样，这是一个很容易踩坑的地方：",[71,72,73,83],"ul",{},[74,75,76,79,80,82],"li",{},[21,77,78],{},"秒级时间戳","：",[16,81,18],{},"（10位数字）",[74,84,85,79,88,91],{},[21,86,87],{},"毫秒级时间戳",[16,89,90],{},"1715760000000","（13位数字）",[12,93,94,95,98,99,102],{},"JavaScript 的 ",[16,96,97],{},"Date.now()"," 返回的是毫秒级，很多数据库和 API 也用毫秒；而 Python 的 ",[16,100,101],{},"time.time()"," 返回秒级浮点数。",[12,104,105,108],{},[21,106,107],{},"快速判断法则","：10 位数字 → 秒级；13 位数字 → 毫秒级。",[12,110,111],{},"如果把毫秒级时间戳当秒级处理，算出来的日期会是 5 万多年后——这种 Bug 不好找，提前了解能省去不少麻烦。",[29,113,115],{"id":114},"开发者为什么喜欢用时间戳","开发者为什么喜欢用时间戳？",[12,117,118,119,122],{},"明明可以存 ",[16,120,121],{},"\"2025-05-15 08:00:00\""," 这种字符串，为什么要用一个大数字？原因是时间戳在工程上有几个明显优势：",[12,124,125,128],{},[21,126,127],{},"与时区无关","。时间戳永远是 UTC 基准，时区的转换在展示时再做。这从根本上消除了\"数据库存了什么时区\"、\"服务器在哪里\"这类问题，时区 Bug 少太多了。",[12,130,131,134,135,138],{},[21,132,133],{},"计算超方便","。判断某事件是否发生在 7 天前？直接做减法：",[16,136,137],{},"now - timestamp > 7 * 24 * 3600","。不需要解析字符串，不需要处理月份天数不同的边界情况。",[12,140,141,144,145,148,149,152],{},[21,142,143],{},"各语言、数据库通用","。你不需要担心 ",[16,146,147],{},"MM\u002FDD\u002FYYYY"," 还是 ",[16,150,151],{},"DD-MM-YYYY"," 的格式差异，整数就是整数，人人都认。",[12,154,155,158],{},[21,156,157],{},"排序友好","。时间戳本身就是整数，按数字大小排序就是按时间顺序排序，无需特殊处理。",[12,160,161,164],{},[21,162,163],{},"存储紧凑","。一个整数比一段日期字符串占用的存储空间少，在大规模数据场景下有意义。",[29,166,167],{"id":167},"常用时间戳参考值",[12,169,170],{},"记住几个锚点数字，遇到时间戳时能快速心算：",[172,173,174,187],"table",{},[175,176,177],"thead",{},[178,179,180,184],"tr",{},[181,182,183],"th",{},"日期",[181,185,186],{},"Unix 时间戳（秒）",[188,189,190,201,211,221,231,241],"tbody",{},[178,191,192,196],{},[193,194,195],"td",{},"2000 年 1 月 1 日（Y2K）",[193,197,198],{},[16,199,200],{},"946684800",[178,202,203,206],{},[193,204,205],{},"2010 年 1 月 1 日",[193,207,208],{},[16,209,210],{},"1262304000",[178,212,213,216],{},[193,214,215],{},"2020 年 1 月 1 日",[193,217,218],{},[16,219,220],{},"1577836800",[178,222,223,226],{},[193,224,225],{},"2024 年 1 月 1 日",[193,227,228],{},[16,229,230],{},"1704067200",[178,232,233,236],{},[193,234,235],{},"2025 年 1 月 1 日",[193,237,238],{},[16,239,240],{},"1735689600",[178,242,243,246],{},[193,244,245],{},"2030 年 1 月 1 日",[193,247,248],{},[16,249,250],{},"1893456000",[12,252,253],{},"看到一个约 17 亿的时间戳，大约是 2023–2024 年；约 19 亿则是 2030 年代。这些参考值能帮你一眼判断时间戳是否合理，也能快速发现秒级\u002F毫秒级搞混的问题。",[255,256,258],"h3",{"id":257},"附2038-年问题","附：2038 年问题",[12,260,261,262,265,266,269],{},"如果你用 32 位整数存储时间戳，它会在 ",[21,263,264],{},"2038 年 1 月 19 日 03:14:07 UTC","（时间戳 ",[16,267,268],{},"2147483647","）溢出，之后变成负数——这就是\"2038 年问题\"，类似当年的 Y2K。现代系统普遍使用 64 位时间戳，可以撑到几千亿年后，暂时不用担心。",[29,271,273],{"id":272},"代码中怎么转换","代码中怎么转换？",[12,275,276],{},[21,277,278],{},"时间戳 → 可读日期",[12,280,281],{},"JavaScript：",[283,284,289],"pre",{"className":285,"code":286,"language":287,"meta":288,"style":288},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","new Date(1715760000 * 1000).toISOString()\n\u002F\u002F \"2025-05-15T08:00:00.000Z\"\n","js","",[16,290,291,329],{"__ignoreMap":288},[292,293,296,300,304,308,311,314,317,320,323,326],"span",{"class":294,"line":295},"line",1,[292,297,299],{"class":298},"sMK4o","new",[292,301,303],{"class":302},"s2Zo4"," Date",[292,305,307],{"class":306},"sTEyZ","(",[292,309,18],{"class":310},"sbssI",[292,312,313],{"class":298}," *",[292,315,316],{"class":310}," 1000",[292,318,319],{"class":306},")",[292,321,322],{"class":298},".",[292,324,325],{"class":302},"toISOString",[292,327,328],{"class":306},"()\n",[292,330,332],{"class":294,"line":331},2,[292,333,335],{"class":334},"sHwdD","\u002F\u002F \"2025-05-15T08:00:00.000Z\"\n",[12,337,338],{},"Python：",[283,340,344],{"className":341,"code":342,"language":343,"meta":288,"style":288},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import datetime\ndatetime.datetime.utcfromtimestamp(1715760000)\n# datetime.datetime(2025, 5, 15, 8, 0)\n","python",[16,345,346,351,356],{"__ignoreMap":288},[292,347,348],{"class":294,"line":295},[292,349,350],{},"import datetime\n",[292,352,353],{"class":294,"line":331},[292,354,355],{},"datetime.datetime.utcfromtimestamp(1715760000)\n",[292,357,359],{"class":294,"line":358},3,[292,360,361],{},"# datetime.datetime(2025, 5, 15, 8, 0)\n",[12,363,364],{},[21,365,366],{},"当前时间 → 时间戳",[12,368,281],{},[283,370,372],{"className":285,"code":371,"language":287,"meta":288,"style":288},"Math.floor(Date.now() \u002F 1000)  \u002F\u002F 当前秒级时间戳\n",[16,373,374],{"__ignoreMap":288},[292,375,376,379,381,384,387,389,392,395,398,400,403],{"class":294,"line":295},[292,377,378],{"class":306},"Math",[292,380,322],{"class":298},[292,382,383],{"class":302},"floor",[292,385,386],{"class":306},"(Date",[292,388,322],{"class":298},[292,390,391],{"class":302},"now",[292,393,394],{"class":306},"() ",[292,396,397],{"class":298},"\u002F",[292,399,316],{"class":310},[292,401,402],{"class":306},")  ",[292,404,405],{"class":334},"\u002F\u002F 当前秒级时间戳\n",[12,407,338],{},[283,409,411],{"className":341,"code":410,"language":343,"meta":288,"style":288},"import time\nint(time.time())  # 当前秒级时间戳\n",[16,412,413,418],{"__ignoreMap":288},[292,414,415],{"class":294,"line":295},[292,416,417],{},"import time\n",[292,419,420],{"class":294,"line":331},[292,421,422],{},"int(time.time())  # 当前秒级时间戳\n",[12,424,425],{},"代码当然可以做到，但如果你只是想快速查个数字——比如看日志的时候、和同事确认某个时间点、或者手动构造测试数据——打开在线工具更快，不用开编辑器，不用跑代码。",[29,427,428],{"id":428},"在线工具的典型使用场景",[71,430,431,434,437,440,443],{},[74,432,433],{},"查看线上日志里的时间戳对应的实际时间",[74,435,436],{},"生成某个特定日期的时间戳，用于数据库查询或测试",[74,438,439],{},"确认两套系统的时间戳是否对应同一时刻",[74,441,442],{},"向非技术同事解释时间戳的含义",[74,444,445],{},"快速换算秒级和毫秒级时间戳",[12,447,448],{},"一个好的在线时间戳工具支持双向转换：输入时间戳得到日期，也可以输入日期得到时间戳，还能显示不同时区的对应时间。",[450,451],"hr",{},[12,453,454],{},"时间戳乍看抽象，理解了 epoch 的概念之后其实很简单。下次遇到一串数字，你已经知道它代表什么了。",[12,456,457],{},[458,459,461],"a",{"href":460},"\u002Fzh\u002Ftools\u002Ftimestamp-converter",[21,462,463],{},"立即使用 ujiffy 时间戳转换工具 →",[12,465,466],{},"输入时间戳秒数一键转换，或者选择日期生成对应时间戳——免费，无需注册。",[468,469,470],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":288,"searchDepth":331,"depth":331,"links":472},[473,474,475,476,479,480],{"id":31,"depth":331,"text":32},{"id":65,"depth":331,"text":66},{"id":114,"depth":331,"text":115},{"id":167,"depth":331,"text":167,"children":477},[478],{"id":257,"depth":358,"text":258},{"id":272,"depth":331,"text":273},{"id":428,"depth":331,"text":428},"对 Unix 时间戳感到困惑？了解 epoch 时间是什么、开发者为何使用它、如何将时间戳转换为可读日期。",false,"mdx","zh",{},true,"\u002Fblog\u002Fzh-unix-timestamp-converter-guide","2025-05-20","timestamp-converter",{"title":6,"description":481},"blog\u002Fzh-unix-timestamp-converter-guide",[493,494,495,496],"Unix时间戳","epoch时间","时间戳转换","开发者工具","Qfc5maBOTTQcqmwQp95k1pImf8UWANNXd8ms-q_iBnA",{"id":499,"title":500,"author":7,"body":501,"description":919,"draft":482,"extension":483,"lang":484,"meta":920,"navigation":486,"path":921,"pubDate":922,"relatedTool":923,"seo":924,"stem":925,"tags":926,"__hash__":929},"blog\u002Fblog\u002Fzh-base64-encoding-explained.mdx","Base64 编码详解：是什么以及何时使用",{"type":9,"value":502,"toc":905},[503,506,510,528,545,552,556,559,562,569,579,583,586,590,593,627,630,634,654,658,669,677,692,696,699,703,706,709,715,721,727,742,746,749,771,774,888,891,894,902],[12,504,505],{},"Base64 是每个开发者迟早都会遇到、但很多人存在误解的东西。最常见的误区：认为 Base64 编码是一种安全措施或加密手段。它完全不是。让我们先澄清这一点——然后再聊 Base64 究竟是什么、如何工作，以及什么时候真正需要用到它。",[29,507,509],{"id":508},"什么是-base64","什么是 Base64？",[12,511,512,513,516,517,520,521,523,524,527],{},"Base64 是一种",[21,514,515],{},"编码方案","，用于将二进制数据转换为可打印 ASCII 字符的字符串。名称来源于它使用 64 个可打印字符来表示数据：26 个大写字母（A–Z）、26 个小写字母（a–z）、10 个数字（0–9），以及 ",[16,518,519],{},"+"," 和 ",[16,522,397],{},"（用 ",[16,525,526],{},"="," 补位）。",[12,529,530,531,534,535,538,539,542,543,24],{},"关键点在于：",[21,532,533],{},"编码不是加密","。当你对某个内容进行 Base64 编码时，你并没有隐藏它。任何看到 Base64 字符串的人都可以立刻解码——不需要密钥，不需要密码。如果你对文本 ",[16,536,537],{},"hello"," 进行 Base64 编码，得到的是 ",[16,540,541],{},"aGVsbG8=","。把它丢进解码器，你就得到了 ",[16,544,537],{},[12,546,547,548,551],{},"Base64 存在的理由完全不同：",[21,549,550],{},"兼容性","。某些系统——电子邮件协议、URL、HTML 属性、特定 API——最初被设计为处理文本，而非任意二进制数据。Base64 是一种将二进制数据（如图片或文件）转换为仅使用安全可打印 ASCII 字符的方式，使其能够在这些基于文本的系统中传输而不被破坏。",[29,553,555],{"id":554},"base64-的工作原理简要版","Base64 的工作原理（简要版）",[12,557,558],{},"二进制数据是字节流，每个字节是 8 位。Base64 每次取 3 个字节（24 位），将它们分成 4 组，每组 6 位。每个 6 位的组映射到 Base64 字母表中的一个字符。",[12,560,561],{},"为什么是 6 位？因为 2⁶ = 64，正好是编码字母表中的字符数量。",[12,563,564,565,568],{},"结果：每 3 个字节的输入变成 4 个 Base64 字符的输出。这意味着 Base64 编码后的数据比原始数据大约",[21,566,567],{},"大 33%","。这就是代价——以体积换兼容性。",[12,570,571,572,574,575,578],{},"如果输入不是 3 字节的倍数，则在末尾添加填充字符（",[16,573,526],{}," 或 ",[16,576,577],{},"==","），使输出长度为 4 的倍数。",[29,580,582],{"id":581},"开发者在哪些地方用到-base64","开发者在哪些地方用到 Base64？",[12,584,585],{},"Base64 在日常 Web 开发中出现的频率出乎意料地高：",[255,587,589],{"id":588},"data-url内联图片","Data URL（内联图片）",[12,591,592],{},"当你将图片直接嵌入 HTML 或 CSS 而不使用单独的文件时，就会用到 Data URL。图片的二进制内容经过 Base64 编码后内联放置：",[283,594,598],{"className":595,"code":596,"language":597,"meta":288,"style":288},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cimg src=\"data:image\u002Fpng;base64,iVBORw0KGgoAAAANS...\" \u002F>\n","html",[16,599,600],{"__ignoreMap":288},[292,601,602,605,609,613,615,618,622,624],{"class":294,"line":295},[292,603,604],{"class":298},"\u003C",[292,606,608],{"class":607},"swJcz","img",[292,610,612],{"class":611},"spNyl"," src",[292,614,526],{"class":298},[292,616,617],{"class":298},"\"",[292,619,621],{"class":620},"sfazB","data:image\u002Fpng;base64,iVBORw0KGgoAAAANS...",[292,623,617],{"class":298},[292,625,626],{"class":298}," \u002F>\n",[12,628,629],{},"这种技术适合小图标或希望打包进单文件的图片，可以减少一次 HTTP 请求。",[255,631,633],{"id":632},"jwtjson-web-token","JWT（JSON Web Token）",[12,635,636,637,639,640,643,644,639,646,649,650,653],{},"JWT 使用 Base64URL 编码（Base64 的 URL 安全变体，将 ",[16,638,519],{}," 替换为 ",[16,641,642],{},"-","，",[16,645,397],{},[16,647,648],{},"_","）。JWT 的 header 和 payload 部分是 Base64URL 编码的 JSON 对象——这就是为什么你可以把一个 JWT 丢进解码器直接读取其中的声明（claims）。",[21,651,652],{},"这并非加密","。签名部分用于验证完整性，但 payload 对任何人都是可读的。",[255,655,657],{"id":656},"http-basic-认证","HTTP Basic 认证",[12,659,660,661,664,665,668],{},"当浏览器或 API 客户端发送 Basic Auth 凭证时，",[16,662,663],{},"用户名:密码"," 字符串会被 Base64 编码后放入 ",[16,666,667],{},"Authorization"," 请求头：",[283,670,675],{"className":671,"code":673,"language":674},[672],"language-text","Authorization: Basic dXNlcjpwYXNzd29yZA==\n","text",[16,676,673],{"__ignoreMap":288},[12,678,679,680,683,684,687,688,691],{},"解码 ",[16,681,682],{},"dXNlcjpwYXNzd29yZA=="," 得到的就是 ",[16,685,686],{},"user:password","。这就是为什么 ",[21,689,690],{},"Basic Auth 必须始终在 HTTPS 下使用","——凭证是可以被轻易还原的。",[255,693,695],{"id":694},"电子邮件附件mime","电子邮件附件（MIME）",[12,697,698],{},"管理邮件附件的 MIME 标准使用 Base64 来编码二进制文件。当你收到一封带有 PDF 附件的邮件时，那个 PDF 在原始邮件源码中就是 Base64 编码的。原本设计用于纯文本的邮件服务器，可以通过这种方式安全地传输二进制内容。",[255,700,702],{"id":701},"在-json-或-xml-中存储二进制数据","在 JSON 或 XML 中存储二进制数据",[12,704,705],{},"JSON 没有原生的二进制类型。当 API 需要在 JSON 响应中包含二进制数据（如缩略图或加密密钥）时，Base64 编码是标准做法。",[29,707,708],{"id":708},"常见误区",[12,710,711,714],{},[21,712,713],{},"\"Base64 是加密\"","\n不是。它可以被轻易还原。永远不要用 Base64 来\"保护\"敏感数据。加密请使用 AES、RSA 等真正的加密算法。",[12,716,717,720],{},[21,718,719],{},"\"Base64 可以压缩数据\"","\n恰恰相反。Base64 会让数据体积增加约 33%。这是为了兼容性而接受的大小代价。",[12,722,723,726],{},[21,724,725],{},"\"存储密码前应该 Base64 编码\"","\n绝对不要这样做。密码应当使用 bcrypt、Argon2 或 scrypt 等合适的算法进行哈希处理。Base64 不提供任何安全保障。",[12,728,729,732,733,639,735,643,737,639,739,741],{},[21,730,731],{},"\"Base64URL 和 Base64 是同一回事\"","\n接近但不完全相同。Base64URL 将 ",[16,734,519],{},[16,736,642],{},[16,738,397],{},[16,740,648],{},"，并省略填充符。这使其可以安全用于 URL 和文件名，无需百分比编码。",[29,743,745],{"id":744},"如何在线进行-base64-编解码","如何在线进行 Base64 编解码",[12,747,748],{},"你不需要写代码就能对内容进行 Base64 编码或解码。ujiffy 的免费 Base64 工具让你可以：",[71,750,751,758,765,768],{},[74,752,753,754,757],{},"将任何文本或二进制输入",[21,755,756],{},"编码","为 Base64",[74,759,760,761,764],{},"将任何 Base64 字符串",[21,762,763],{},"解码","回原始内容",[74,766,767],{},"完全在浏览器中运行——不向服务器发送任何内容",[74,769,770],{},"支持标准 Base64 和 Base64URL",[12,772,773],{},"开发者需要在代码中使用时的快速参考：",[283,775,777],{"className":285,"code":776,"language":287,"meta":288,"style":288},"\u002F\u002F JavaScript\nbtoa(\"hello\")          \u002F\u002F 编码 → \"aGVsbG8=\"\natob(\"aGVsbG8=\")       \u002F\u002F 解码 → \"hello\"\n\n\u002F\u002F Python\nimport base64\nbase64.b64encode(b\"hello\")        # → b'aGVsbG8='\nbase64.b64decode(\"aGVsbG8=\")     # → b'hello'\n",[16,778,779,784,803,822,828,834,844,867],{"__ignoreMap":288},[292,780,781],{"class":294,"line":295},[292,782,783],{"class":334},"\u002F\u002F JavaScript\n",[292,785,786,789,791,793,795,797,800],{"class":294,"line":331},[292,787,788],{"class":302},"btoa",[292,790,307],{"class":306},[292,792,617],{"class":298},[292,794,537],{"class":620},[292,796,617],{"class":298},[292,798,799],{"class":306},")          ",[292,801,802],{"class":334},"\u002F\u002F 编码 → \"aGVsbG8=\"\n",[292,804,805,808,810,812,814,816,819],{"class":294,"line":358},[292,806,807],{"class":302},"atob",[292,809,307],{"class":306},[292,811,617],{"class":298},[292,813,541],{"class":620},[292,815,617],{"class":298},[292,817,818],{"class":306},")       ",[292,820,821],{"class":334},"\u002F\u002F 解码 → \"hello\"\n",[292,823,825],{"class":294,"line":824},4,[292,826,827],{"emptyLinePlaceholder":486},"\n",[292,829,831],{"class":294,"line":830},5,[292,832,833],{"class":334},"\u002F\u002F Python\n",[292,835,837,841],{"class":294,"line":836},6,[292,838,840],{"class":839},"s7zQu","import",[292,842,843],{"class":306}," base64\n",[292,845,847,850,852,854,856,859,862,864],{"class":294,"line":846},7,[292,848,849],{"class":306},"base64.b64encode(b",[292,851,617],{"class":298},[292,853,537],{"class":620},[292,855,617],{"class":298},[292,857,858],{"class":306},")        # → b",[292,860,861],{"class":298},"'",[292,863,541],{"class":620},[292,865,866],{"class":298},"'\n",[292,868,870,873,875,877,879,882,884,886],{"class":294,"line":869},8,[292,871,872],{"class":306},"base64.b64decode(",[292,874,617],{"class":298},[292,876,541],{"class":620},[292,878,617],{"class":298},[292,880,881],{"class":306},")     # → b",[292,883,861],{"class":298},[292,885,537],{"class":620},[292,887,866],{"class":298},[29,889,890],{"id":890},"小结",[12,892,893],{},"Base64 是一种默默支撑着现代 Web 大量功能的编码方式——从内联图片到认证头，再到 JWT，无处不在。理解它是什么（以及它不是什么）能帮助你正确使用它，避免将其误当成加密手段的安全错误。它是兼容性工具，不是安全工具。请按此认知使用它。",[12,895,896],{},[458,897,899],{"href":898},"\u002Fzh\u002Ftools\u002Fbase64-encoder",[21,900,901],{},"立即使用 ujiffy Base64 编码器 →",[468,903,904],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":288,"searchDepth":331,"depth":331,"links":906},[907,908,909,916,917,918],{"id":508,"depth":331,"text":509},{"id":554,"depth":331,"text":555},{"id":581,"depth":331,"text":582,"children":910},[911,912,913,914,915],{"id":588,"depth":358,"text":589},{"id":632,"depth":358,"text":633},{"id":656,"depth":358,"text":657},{"id":694,"depth":358,"text":695},{"id":701,"depth":358,"text":702},{"id":708,"depth":331,"text":708},{"id":744,"depth":331,"text":745},{"id":890,"depth":331,"text":890},"Base64 不是加密——了解它实际做什么、为什么开发者用它编码图片和 API 凭证，以及如何免费在线编解码。",{},"\u002Fblog\u002Fzh-base64-encoding-explained","2025-05-18","base64-encoder",{"title":500,"description":919},"blog\u002Fzh-base64-encoding-explained",[927,756,496,928],"base64","Web开发","snapteB-ToirH-bztxGFIw4eEO4KPbhDB_dNoO3ai50",{"id":931,"title":932,"author":7,"body":933,"description":1239,"draft":482,"extension":483,"lang":484,"meta":1240,"navigation":486,"path":1241,"pubDate":1242,"relatedTool":1243,"seo":1244,"stem":1245,"tags":1246,"__hash__":1250},"blog\u002Fblog\u002Fzh-compare-two-texts-online-diff-checker.mdx","如何在线比较两段文本——Diff 工具使用指南",{"type":9,"value":934,"toc":1230},[935,942,945,949,961,968,972,975,981,994,1000,1006,1012,1016,1019,1050,1057,1063,1069,1075,1078,1151,1154,1157,1163,1169,1175,1181,1184,1211,1214,1216,1219,1227],[12,936,937,938,941],{},"改了配置文件，但忘了改了哪几行？同事发来一段\"更新过的\"代码，你需要知道改了什么？手动逐行比对，费时费力还容易出错。这时候，一个 ",[21,939,940],{},"Diff 工具","能在几秒钟内帮你搞定。",[12,943,944],{},"这篇文章带你了解 Diff 是什么、什么时候用、怎么读懂红绿高亮，以及在线工具和命令行方式各有什么优劣。",[29,946,948],{"id":947},"diff-是什么","Diff 是什么？",[12,950,951,952,956,957,960],{},"\"Diff\"来自 ",[953,954,955],"em",{},"difference","（差异）。在文本和代码的语境下，diff 就是",[21,958,959],{},"两个版本之间的变化记录","——哪些行被删除了、哪些行是新增的、哪些行没有变动。",[12,962,963,964,967],{},"这个概念来自 Unix 系统里的 ",[16,965,966],{},"diff"," 命令，已经存在了几十年。如今，Git 的变更追踪、GitHub 的 Pull Request 视图、各种代码审查工具，背后都是 diff 的逻辑。",[29,969,971],{"id":970},"什么时候需要用-diff-工具","什么时候需要用 Diff 工具？",[12,973,974],{},"比你想象的场景多得多：",[12,976,977,980],{},[21,978,979],{},"代码审查（Code Review）","\n只想看改了哪里，不想重读整个文件？Diff 过滤掉没变的内容，只展示关键的变动。",[12,982,983,986,987,574,990,993],{},[21,984,985],{},"配置文件对比","\n线上环境出问题了，需要比对生产环境和测试环境的 ",[16,988,989],{},"nginx.conf",[16,991,992],{},"docker-compose.yml","？粘贴进去，一秒出结果。",[12,995,996,999],{},[21,997,998],{},"文档版本对比","\n写作或翻译时，对比两个草稿版本；团队协作时，快速看出别人改了哪些措辞——不需要版本控制系统也能做到。",[12,1001,1002,1005],{},[21,1003,1004],{},"排查意外修改","\n某个文件被脚本或构建流程悄悄改动了，对比一下就能知道动了哪里。",[12,1007,1008,1011],{},[21,1009,1010],{},"API 响应对比","\n两个版本的接口返回了不同的 JSON？粘进 Diff 工具，字段变化一览无余。",[29,1013,1015],{"id":1014},"怎么读懂红绿高亮","怎么读懂红绿高亮？",[12,1017,1018],{},"大多数 Diff 工具用颜色来区分变化，规则很直觉：",[71,1020,1021,1032,1043],{},[74,1022,1023,1024,1027,1028,1031],{},"🟥 ",[21,1025,1026],{},"红色（删除）"," — 这些行在",[21,1029,1030],{},"原始版本","里有，在新版本里被删掉了",[74,1033,1034,1035,1038,1039,1042],{},"🟩 ",[21,1036,1037],{},"绿色（新增）"," — 这些行是在",[21,1040,1041],{},"新版本","里加入的",[74,1044,1045,1046,1049],{},"⬜ ",[21,1047,1048],{},"灰白（未变）"," — 没有改动的行，显示为背景色，提供上下文",[12,1051,1052,1053,1056],{},"更好的工具还会做",[21,1054,1055],{},"行内高亮","——如果某行只改了一个词，只会高亮那个词，不是整行飘红。这对比较配置文件和文档特别有用，能精确定位到字符级别的变化。",[29,1058,1060,1061],{"id":1059},"在线工具-vs-命令行-diff","在线工具 vs 命令行 ",[16,1062,966],{},[12,1064,1065,1066,1068],{},"Linux\u002FmacOS 自带的 ",[16,1067,966],{}," 命令很强大，但输出格式不直观：",[283,1070,1073],{"className":1071,"code":1072,"language":674},[672],"\u003C 旧的这行\n---\n> 新的这行\n",[16,1074,1072],{"__ignoreMap":288},[12,1076,1077],{},"两者对比：",[172,1079,1080,1095],{},[175,1081,1082],{},[178,1083,1084,1087,1090],{},[181,1085,1086],{},"特性",[181,1088,1089],{},"在线 Diff 工具",[181,1091,1092,1093],{},"命令行 ",[16,1094,966],{},[188,1096,1097,1108,1119,1129,1140],{},[178,1098,1099,1102,1105],{},[193,1100,1101],{},"可视化",[193,1103,1104],{},"✅ 彩色并排显示",[193,1106,1107],{},"❌ 纯文本符号",[178,1109,1110,1113,1116],{},[193,1111,1112],{},"是否需要安装",[193,1114,1115],{},"❌ 浏览器即用",[193,1117,1118],{},"✅ 需要终端环境",[178,1120,1121,1123,1126],{},[193,1122,1055],{},[193,1124,1125],{},"✅ 支持词\u002F字符级",[193,1127,1128],{},"⚠️ 需要额外参数",[178,1130,1131,1134,1137],{},[193,1132,1133],{},"适合分享",[193,1135,1136],{},"✅ 可以截图或链接分享",[193,1138,1139],{},"❌ 仅限本地",[178,1141,1142,1145,1148],{},[193,1143,1144],{},"适合场景",[193,1146,1147],{},"快速对比、与他人协作",[193,1149,1150],{},"脚本自动化、批量处理",[12,1152,1153],{},"如果只是临时对比两段文本，或者要把结果给不懂命令行的同事看，在线工具明显更方便。",[29,1155,1156],{"id":1156},"使用技巧",[12,1158,1159,1162],{},[21,1160,1161],{},"先统一格式再对比","。如果两个文件一个用 Tab 缩进、一个用空格，diff 会显示几乎每一行都变了。建议先格式化，或者开启\"忽略空白字符\"选项。",[12,1164,1165,1168],{},[21,1166,1167],{},"保持左旧右新的习惯","。约定俗成：左边放原始版本，右边放修改后的版本。绿色 = 新版本新增的，红色 = 原版本有但被删掉的。方向搞反了容易看混。",[12,1170,1171,1174],{},[21,1172,1173],{},"利用上下文行理解改动位置","。Diff 工具会在变化行的上下显示几行未改动的内容作为参照，帮助你判断这个改动发生在文件的哪个部分、改的是什么逻辑。",[12,1176,1177,1180],{},[21,1178,1179],{},"代码用并排视图，长文用单列视图","。并排（side-by-side）方便同时阅读新旧两个版本，适合散文和文档；单列（unified）更紧凑，开发者看代码时常用。",[29,1182,1183],{"id":1183},"一个典型的使用流程",[1185,1186,1187,1190,1196,1202,1205,1208],"ol",{},[74,1188,1189],{},"打开在线 Diff 工具",[74,1191,1192,1193],{},"左侧粘贴",[21,1194,1195],{},"原始文本",[74,1197,1198,1199],{},"右侧粘贴",[21,1200,1201],{},"修改后的文本",[74,1203,1204],{},"点击\"比较\"（或实时自动刷新）",[74,1206,1207],{},"扫一眼红绿高亮，找出所有变动",[74,1209,1210],{},"结合上下文行，理解每处改动的含义",[12,1212,1213],{},"整个过程不需要登录、不需要安装，30秒以内搞定。",[450,1215],{},[12,1217,1218],{},"下次遇到需要对比两段文本的场景，不要再用眼睛盯着逐行找了。",[12,1220,1221],{},[458,1222,1224],{"href":1223},"\u002Fzh\u002Ftools\u002Fdiff-checker",[21,1225,1226],{},"立即使用 ujiffy Diff 工具 →",[12,1228,1229],{},"粘贴两段文本，差异立刻高亮显示——免费，无需注册。",{"title":288,"searchDepth":331,"depth":331,"links":1231},[1232,1233,1234,1235,1237,1238],{"id":947,"depth":331,"text":948},{"id":970,"depth":331,"text":971},{"id":1014,"depth":331,"text":1015},{"id":1059,"depth":331,"text":1236},"在线工具 vs 命令行 diff",{"id":1156,"depth":331,"text":1156},{"id":1183,"depth":331,"text":1183},"用免费在线 Diff 工具快速找出两段代码、配置文件或文档之间的差异——无需下载，无需登录。",{},"\u002Fblog\u002Fzh-compare-two-texts-online-diff-checker","2025-05-17","diff-checker",{"title":932,"description":1239},"blog\u002Fzh-compare-two-texts-online-diff-checker",[1247,1248,496,1249],"diff工具","文本对比","代码审查","G3QSXsoo9l_7JHG70qC26ELgFmFJG7wcxVFG5mjmyxw",{"id":1252,"title":1253,"author":7,"body":1254,"description":1769,"draft":482,"extension":483,"lang":484,"meta":1770,"navigation":486,"path":1771,"pubDate":1772,"relatedTool":1773,"seo":1774,"stem":1775,"tags":1776,"__hash__":1779},"blog\u002Fblog\u002Fzh-regex-tester-guide-for-beginners.mdx","正则表达式入门指南：在线测试 Regex 模式",{"type":9,"value":1255,"toc":1753},[1256,1266,1269,1273,1279,1282,1285,1288,1291,1294,1377,1380,1442,1445,1487,1490,1522,1526,1530,1536,1539,1565,1578,1582,1588,1590,1618,1622,1628,1631,1639,1646,1650,1653,1656,1688,1691,1694,1737,1739,1742,1750],[12,1257,1258,1259,574,1262,1265],{},"正则表达式（Regular Expression，简称 ",[21,1260,1261],{},"regex",[21,1263,1264],{},"regexp","）是每个开发者迟早都要掌握的技能。它看起来像一堆乱码，但一旦理解了背后的逻辑，你会发现它简直是文本处理的瑞士军刀——验证表单、解析日志、批量替换内容，统统搞定。",[12,1267,1268],{},"本文带你从零开始，快速掌握正则表达式的核心语法，并学会用在线工具即时测试你的 pattern。",[29,1270,1272],{"id":1271},"正则表达式是什么","正则表达式是什么？",[12,1274,1275,1276,24],{},"简单说：正则表达式是一种",[21,1277,1278],{},"描述文本模式的语言",[12,1280,1281],{},"普通的\"查找\"功能只能搜索固定字符串，而正则可以描述\"结构\"。比如，你不需要一个个去找所有邮箱地址，只需要写一个能匹配\"邮箱格式\"的 pattern，就能一网打尽。",[12,1283,1284],{},"几乎所有主流编程语言都内置了正则支持——JavaScript、Python、Go、Java……代码编辑器的搜索功能、命令行工具 grep、数据库查询，也都支持正则。",[29,1286,1287],{"id":1287},"基础语法速查表",[12,1289,1290],{},"不需要死记硬背，先理解这几类核心概念：",[255,1292,1293],{"id":1293},"字符类",[172,1295,1296,1306],{},[175,1297,1298],{},[178,1299,1300,1303],{},[181,1301,1302],{},"写法",[181,1304,1305],{},"匹配内容",[188,1307,1308,1317,1327,1337,1347,1357,1367],{},[178,1309,1310,1314],{},[193,1311,1312],{},[16,1313,322],{},[193,1315,1316],{},"任意单个字符（不含换行）",[178,1318,1319,1324],{},[193,1320,1321],{},[16,1322,1323],{},"\\d",[193,1325,1326],{},"数字 0–9",[178,1328,1329,1334],{},[193,1330,1331],{},[16,1332,1333],{},"\\w",[193,1335,1336],{},"字母、数字、下划线",[178,1338,1339,1344],{},[193,1340,1341],{},[16,1342,1343],{},"\\s",[193,1345,1346],{},"空白字符（空格、制表符等）",[178,1348,1349,1354],{},[193,1350,1351],{},[16,1352,1353],{},"[abc]",[193,1355,1356],{},"a、b、c 三者之一",[178,1358,1359,1364],{},[193,1360,1361],{},[16,1362,1363],{},"[a-z]",[193,1365,1366],{},"任意小写字母",[178,1368,1369,1374],{},[193,1370,1371],{},[16,1372,1373],{},"[^abc]",[193,1375,1376],{},"除 a、b、c 以外的字符",[255,1378,1379],{"id":1379},"量词",[172,1381,1382,1391],{},[175,1383,1384],{},[178,1385,1386,1388],{},[181,1387,1302],{},[181,1389,1390],{},"含义",[188,1392,1393,1403,1412,1422,1432],{},[178,1394,1395,1400],{},[193,1396,1397],{},[16,1398,1399],{},"*",[193,1401,1402],{},"0 次或多次",[178,1404,1405,1409],{},[193,1406,1407],{},[16,1408,519],{},[193,1410,1411],{},"1 次或多次",[178,1413,1414,1419],{},[193,1415,1416],{},[16,1417,1418],{},"?",[193,1420,1421],{},"0 次或 1 次（可选）",[178,1423,1424,1429],{},[193,1425,1426],{},[16,1427,1428],{},"{3}",[193,1430,1431],{},"恰好 3 次",[178,1433,1434,1439],{},[193,1435,1436],{},[16,1437,1438],{},"{2,5}",[193,1440,1441],{},"2 到 5 次",[255,1443,1444],{"id":1444},"锚点",[172,1446,1447,1455],{},[175,1448,1449],{},[178,1450,1451,1453],{},[181,1452,1302],{},[181,1454,1390],{},[188,1456,1457,1467,1477],{},[178,1458,1459,1464],{},[193,1460,1461],{},[16,1462,1463],{},"^",[193,1465,1466],{},"字符串开头",[178,1468,1469,1474],{},[193,1470,1471],{},[16,1472,1473],{},"$",[193,1475,1476],{},"字符串结尾",[178,1478,1479,1484],{},[193,1480,1481],{},[16,1482,1483],{},"\\b",[193,1485,1486],{},"单词边界",[255,1488,1489],{"id":1489},"分组与选择",[172,1491,1492,1500],{},[175,1493,1494],{},[178,1495,1496,1498],{},[181,1497,1302],{},[181,1499,1390],{},[188,1501,1502,1512],{},[178,1503,1504,1509],{},[193,1505,1506],{},[16,1507,1508],{},"(abc)",[193,1510,1511],{},"捕获分组",[178,1513,1514,1519],{},[193,1515,1516],{},[16,1517,1518],{},"a|b",[193,1520,1521],{},"匹配 a 或 b",[29,1523,1525],{"id":1524},"_3-个实用例子","3 个实用例子",[255,1527,1529],{"id":1528},"例-1邮箱地址","例 1：邮箱地址",[283,1531,1534],{"className":1532,"code":1533,"language":674},[672],"^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$\n",[16,1535,1533],{"__ignoreMap":288},[12,1537,1538],{},"逐段解释：",[71,1540,1541,1547,1553,1559],{},[74,1542,1543,1546],{},[16,1544,1545],{},"^[\\w.-]+"," — 邮箱用户名（字母\u002F数字\u002F点\u002F连字符）",[74,1548,1549,1552],{},[16,1550,1551],{},"@"," — 字面符号 @",[74,1554,1555,1558],{},[16,1556,1557],{},"[\\w.-]+"," — 域名主体",[74,1560,1561,1564],{},[16,1562,1563],{},"\\.[a-zA-Z]{2,}$"," — 点号 + 顶级域名（至少 2 个字母）",[12,1566,1567,1568,1571,1572,574,1575,24],{},"能匹配 ",[16,1569,1570],{},"hello@example.com","，拒绝 ",[16,1573,1574],{},"@nodomain",[16,1576,1577],{},"missingat.com",[255,1579,1581],{"id":1580},"例-2网址url","例 2：网址（URL）",[283,1583,1586],{"className":1584,"code":1585,"language":674},[672],"https?:\\\u002F\\\u002F[\\w.-]+(\\\u002F[\\w.\u002F?=%&-]*)?\n",[16,1587,1585],{"__ignoreMap":288},[12,1589,1538],{},[71,1591,1592,1598,1607,1612],{},[74,1593,1594,1597],{},[16,1595,1596],{},"https?"," — 匹配 http 和 https 两种协议",[74,1599,1600,1603,1604],{},[16,1601,1602],{},":\\\u002F\\\u002F"," — 字面的 ",[16,1605,1606],{},":\u002F\u002F",[74,1608,1609,1611],{},[16,1610,1557],{}," — 域名",[74,1613,1614,1617],{},[16,1615,1616],{},"(\\\u002F[\\w.\u002F?=%&-]*)?"," — 可选的路径和查询参数",[255,1619,1621],{"id":1620},"例-3日期格式yyyy-mm-dd","例 3：日期格式（YYYY-MM-DD）",[283,1623,1626],{"className":1624,"code":1625,"language":674},[672],"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$\n",[16,1627,1625],{"__ignoreMap":288},[12,1629,1630],{},"这个 pattern 不仅匹配格式，还做了基本的范围校验：",[71,1632,1633,1636],{},[74,1634,1635],{},"月份只允许 01–12",[74,1637,1638],{},"日期只允许 01–31",[12,1640,1641,1642,1645],{},"比直接用 ",[16,1643,1644],{},"\\d{4}-\\d{2}-\\d{2}"," 更严格。",[29,1647,1649],{"id":1648},"为什么推荐用在线工具测试","为什么推荐用在线工具测试？",[12,1651,1652],{},"很多人写正则的方式是：写好 → 放到代码里 → 跑程序 → 发现不对 → 再改。这个流程太低效了。",[12,1654,1655],{},"在线正则测试工具的优势：",[71,1657,1658,1664,1670,1676,1682],{},[74,1659,1660,1663],{},[21,1661,1662],{},"实时高亮","：输入 pattern 的同时，匹配结果立即可见",[74,1665,1666,1669],{},[21,1667,1668],{},"快速迭代","：改一个字符，结果马上刷新，无需重新运行程序",[74,1671,1672,1675],{},[21,1673,1674],{},"捕获组可视化","：一眼看出每个分组捕获了什么内容",[74,1677,1678,1681],{},[21,1679,1680],{},"测试多行文本","：直接粘贴真实数据，批量验证",[74,1683,1684,1687],{},[21,1685,1686],{},"零门槛","：不需要安装任何东西，打开浏览器就能用",[12,1689,1690],{},"对于初学者来说，这种即时反馈特别重要——你可以直观地看到哪里匹配了、哪里没匹配，而不是靠猜。",[29,1692,1693],{"id":1693},"几个写正则的小技巧",[71,1695,1696,1702,1714,1727],{},[74,1697,1698,1701],{},[21,1699,1700],{},"从简单开始，逐步扩展","。先写能匹配核心部分的 pattern，验证通过后再加约束。",[74,1703,1704,24,1707,1710,1711,24],{},[21,1705,1706],{},"注意特殊字符要转义",[16,1708,1709],{},". * + ? ( ) [ ] { } ^ $ |"," 在正则里都有特殊含义，要匹配字面值时需要加 ",[16,1712,1713],{},"\\",[74,1715,1716,24,1719,1722,1723,1726],{},[21,1717,1718],{},"用锚点控制匹配范围",[16,1720,1721],{},"\\d+"," 会匹配字符串中任意位置的数字，",[16,1724,1725],{},"^\\d+$"," 才能保证整个字符串都是数字。",[74,1728,1729,1732,1733,1736],{},[21,1730,1731],{},"用捕获组提取内容","。用 ",[16,1734,1735],{},"()"," 括起来的部分，可以在代码里单独提取，非常适合从字符串中解析结构化数据。",[450,1738],{},[12,1740,1741],{},"正则表达式是熟能生巧的技能。不需要把所有语法背下来，理解核心概念后，边查边用就好。",[12,1743,1744],{},[458,1745,1747],{"href":1746},"\u002Fzh\u002Ftools\u002Fregex-tester",[21,1748,1749],{},"立即使用 ujiffy 正则测试工具 →",[12,1751,1752],{},"粘贴你的测试文本，输入 pattern，匹配结果实时高亮——不用注册，不用安装，直接开始。",{"title":288,"searchDepth":331,"depth":331,"links":1754},[1755,1756,1762,1767,1768],{"id":1271,"depth":331,"text":1272},{"id":1287,"depth":331,"text":1287,"children":1757},[1758,1759,1760,1761],{"id":1293,"depth":358,"text":1293},{"id":1379,"depth":358,"text":1379},{"id":1444,"depth":358,"text":1444},{"id":1489,"depth":358,"text":1489},{"id":1524,"depth":331,"text":1525,"children":1763},[1764,1765,1766],{"id":1528,"depth":358,"text":1529},{"id":1580,"depth":358,"text":1581},{"id":1620,"depth":358,"text":1621},{"id":1648,"depth":331,"text":1649},{"id":1693,"depth":331,"text":1693},"正则表达式新手？学习核心语法、邮箱\u002FURL\u002F电话号码等常用模式，并在线即时测试——无需安装任何工具。",{},"\u002Fblog\u002Fzh-regex-tester-guide-for-beginners","2025-05-15","regex-tester",{"title":1253,"description":1769},"blog\u002Fzh-regex-tester-guide-for-beginners",[1777,1261,496,1778],"正则表达式","入门教程","ewmfAC2Oiwvqg2X27IPikbPzMfSHup_i4HF4zLgM-Vc",{"id":1781,"title":1782,"author":7,"body":1783,"description":2152,"draft":482,"extension":483,"lang":484,"meta":2153,"navigation":486,"path":2154,"pubDate":1772,"relatedTool":2155,"seo":2156,"stem":2157,"tags":2158,"__hash__":2161},"blog\u002Fblog\u002Fzh-what-is-uuid-and-how-to-generate.mdx","什么是 UUID 以及如何在线生成",{"type":9,"value":1784,"toc":2140},[1785,1792,1796,1809,1812,1822,1826,1829,1909,1913,1920,1924,1930,1934,1937,1941,1944,1950,1956,1962,1968,1974,1978,1981,2001,2008,2012,2015,2041,2044,2047,2121,2124,2126,2129,2137],[12,1786,1787,1788,1791],{},"如果你做过任何数据库、API 或分布式系统相关的开发，你几乎肯定遇到过 UUID。它们长这样：",[16,1789,1790],{},"550e8400-e29b-41d4-a716-446655440000","。看起来随机，格式却异常固定，而且无处不在。但它们究竟是什么？为什么有用？又该用哪个版本？我们来一一拆解。",[29,1793,1795],{"id":1794},"什么是-uuid","什么是 UUID？",[12,1797,1798,1801,1802,1805,1806,24],{},[21,1799,1800],{},"UUID"," 全称 ",[21,1803,1804],{},"Universally Unique Identifier（通用唯一标识符）","，是一种 128 位的标签，用于在计算机系统中唯一标识信息。格式始终相同：32 个十六进制字符，用连字符分为五组，格式为 ",[16,1807,1808],{},"8-4-4-4-12",[12,1810,1811],{},"\"通用唯一\"是它最核心的价值。UUID 的设计保证：任意两个独立生成的 UUID 几乎肯定是不同的——即使在不同机器上同时生成，也无需任何中心协调。这使得 UUID 在分布式系统中极为有用，因为你不需要依赖一个中心节点来分配 ID。",[12,1813,1814,1815,1821],{},"UUID 由 ",[458,1816,1820],{"href":1817,"rel":1818},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc4122",[1819],"nofollow","RFC 4122"," 标准化，几乎所有主流编程语言和数据库系统都原生支持。",[29,1823,1825],{"id":1824},"uuid-各版本详解","UUID 各版本详解",[12,1827,1828],{},"UUID 有多个版本，生成方式各不相同，适用场景也有所区别。最常用的三个版本是 v1、v4 和 v5。",[172,1830,1831,1850],{},[175,1832,1833],{},[178,1834,1835,1838,1841,1844,1847],{},[181,1836,1837],{},"版本",[181,1839,1840],{},"生成方式",[181,1842,1843],{},"唯一性来源",[181,1845,1846],{},"可预测？",[181,1848,1849],{},"典型使用场景",[188,1851,1852,1871,1890],{},[178,1853,1854,1859,1862,1865,1868],{},[193,1855,1856],{},[21,1857,1858],{},"v1",[193,1860,1861],{},"时间戳 + MAC 地址",[193,1863,1864],{},"时间 + 硬件",[193,1866,1867],{},"部分可预测",[193,1869,1870],{},"事件日志、审计追踪",[178,1872,1873,1878,1881,1884,1887],{},[193,1874,1875],{},[21,1876,1877],{},"v4",[193,1879,1880],{},"随机",[193,1882,1883],{},"纯随机",[193,1885,1886],{},"否",[193,1888,1889],{},"通用场景、数据库主键",[178,1891,1892,1897,1900,1903,1906],{},[193,1893,1894],{},[21,1895,1896],{},"v5",[193,1898,1899],{},"命名空间 + 名称（SHA-1）",[193,1901,1902],{},"确定性",[193,1904,1905],{},"是（相同输入→相同 UUID）",[193,1907,1908],{},"为已知资源生成一致的 ID",[255,1910,1912],{"id":1911},"uuid-v1-基于时间戳","UUID v1 —— 基于时间戳",[12,1914,1915,1916,1919],{},"v1 UUID 编码了当前时间戳和生成机器的 MAC 地址。它具备时间顺序性，便于排序。但缺点是",[21,1917,1918],{},"会泄露信息","——通过分析 v1 UUID，可以大致推断出它是何时、在哪里生成的。对于隐私敏感的场景，这是个需要注意的问题。",[255,1921,1923],{"id":1922},"uuid-v4-随机生成","UUID v4 —— 随机生成",[12,1925,1926,1927],{},"v4 是目前使用最广泛的版本。它由 122 位随机数据生成（另外 6 位用于编码版本和变体）。没有时间戳，没有机器信息，只有随机数据。两个 v4 UUID 发生碰撞的概率低到实际上可以忽略不计。",[21,1928,1929],{},"如果不确定用哪个，就用 v4。",[255,1931,1933],{"id":1932},"uuid-v5-基于名称sha-1","UUID v5 —— 基于名称（SHA-1）",[12,1935,1936],{},"v5 通过对命名空间 UUID 和名称字符串进行 SHA-1 哈希来生成 UUID。相同的命名空间 + 名称始终产生相同的 UUID。当你需要为某个已知资源生成一致的、可复现的标识符时，这非常有用——例如，始终为同一个 URL 或邮箱地址生成同一个 UUID。注意：v3 做同样的事，但使用 MD5（现在较少推荐）。",[29,1938,1940],{"id":1939},"uuid-的常见使用场景","UUID 的常见使用场景",[12,1942,1943],{},"UUID 用途非常广泛，以下是开发者最常使用它的场景：",[12,1945,1946,1949],{},[21,1947,1948],{},"数据库主键","\n许多应用使用 UUID 而非自增整数作为主键。优点在于：多台服务器或客户端可以独立创建记录而不产生 ID 冲突，同时也不会通过 ID 暴露数据库中的记录数量。",[12,1951,1952,1955],{},[21,1953,1954],{},"文件命名与存储","\n将用户上传的文件存入对象存储（S3、R2 等）时，使用 UUID 作为文件名可以避免冲突，同时不向存储层暴露原始文件名。",[12,1957,1958,1961],{},[21,1959,1960],{},"Session ID 与令牌","\nUUID 是很好的 Session 标识符——足够长以至于无法被猜测，又足够简洁以便使用。大多数 Web 框架开箱即用地生成基于 UUID 的 Session 令牌。",[12,1963,1964,1967],{},[21,1965,1966],{},"分布式事件追踪","\n在事件驱动或微服务架构中，UUID 被用作关联 ID，在日志和监控系统中追踪一个请求跨多个服务的完整链路。",[12,1969,1970,1973],{},[21,1971,1972],{},"客户端 ID 生成","\n在离线优先或移动端应用中，记录可以在设备本地以 UUID 为主键创建，再同步到服务器。无需为了获取 ID 而额外往返服务器。",[29,1975,1977],{"id":1976},"v4-vs-v1-vs-v5-该用哪个","v4 vs v1 vs v5 —— 该用哪个？",[12,1979,1980],{},"大多数场景的简短答案：",[71,1982,1983,1989,1995],{},[74,1984,1985,1988],{},[21,1986,1987],{},"用 v4","：如果你只需要一个唯一的、不透明的 ID，且不需要它可复现。",[74,1990,1991,1994],{},[21,1992,1993],{},"用 v1","：如果你需要按时间排序的 ID，且不在意隐私问题。",[74,1996,1997,2000],{},[21,1998,1999],{},"用 v5","：如果你需要从已知的名称或资源中推导出一个一致的 ID。",[12,2002,2003,2004,2007],{},"对于新项目，",[21,2005,2006],{},"v4 是安全的默认选择","，除非你有特定原因需要选择其他版本。",[29,2009,2011],{"id":2010},"如何在线生成-uuid","如何在线生成 UUID",[12,2013,2014],{},"如果你需要一个用于测试、开发或配置的 UUID，不需要写任何代码。ujiffy 的免费 UUID 生成器让你可以：",[71,2016,2017,2024,2031,2034],{},[74,2018,2019,2020,2023],{},"一次生成",[21,2021,2022],{},"一个或多个"," UUID",[74,2025,2026,2027,2030],{},"选择 ",[21,2028,2029],{},"v1、v4 或 v5"," 版本",[74,2032,2033],{},"即时复制到剪贴板",[74,2035,2036,2037,2040],{},"所有操作都在",[21,2038,2039],{},"浏览器本地","运行——不经过服务器",[12,2042,2043],{},"无需注册，无频率限制，无追踪。",[12,2045,2046],{},"如果你需要在代码中生成 UUID，以下是快速示例：",[283,2048,2050],{"className":285,"code":2049,"language":287,"meta":288,"style":288},"\u002F\u002F JavaScript (浏览器或 Node 14.17+)\ncrypto.randomUUID() \u002F\u002F 生成 v4 UUID\n\n\u002F\u002F Python\nimport uuid\nstr(uuid.uuid4())\n\n\u002F\u002F Go\nimport \"github.com\u002Fgoogle\u002Fuuid\"\nuuid.New().String()\n",[16,2051,2052,2057,2072,2076,2080,2087,2092,2096,2101,2115],{"__ignoreMap":288},[292,2053,2054],{"class":294,"line":295},[292,2055,2056],{"class":334},"\u002F\u002F JavaScript (浏览器或 Node 14.17+)\n",[292,2058,2059,2062,2064,2067,2069],{"class":294,"line":331},[292,2060,2061],{"class":306},"crypto",[292,2063,322],{"class":298},[292,2065,2066],{"class":302},"randomUUID",[292,2068,394],{"class":306},[292,2070,2071],{"class":334},"\u002F\u002F 生成 v4 UUID\n",[292,2073,2074],{"class":294,"line":358},[292,2075,827],{"emptyLinePlaceholder":486},[292,2077,2078],{"class":294,"line":824},[292,2079,833],{"class":334},[292,2081,2082,2084],{"class":294,"line":830},[292,2083,840],{"class":839},[292,2085,2086],{"class":306}," uuid\n",[292,2088,2089],{"class":294,"line":836},[292,2090,2091],{"class":306},"str(uuid.uuid4())\n",[292,2093,2094],{"class":294,"line":846},[292,2095,827],{"emptyLinePlaceholder":486},[292,2097,2098],{"class":294,"line":869},[292,2099,2100],{"class":334},"\u002F\u002F Go\n",[292,2102,2104,2107,2109,2112],{"class":294,"line":2103},9,[292,2105,2106],{"class":306},"import ",[292,2108,617],{"class":298},[292,2110,2111],{"class":620},"github.com\u002Fgoogle\u002Fuuid",[292,2113,2114],{"class":298},"\"\n",[292,2116,2118],{"class":294,"line":2117},10,[292,2119,2120],{"class":306},"uuid.New().String()\n",[12,2122,2123],{},"但如果你现在就需要一个 UUID，用生成器会更快。",[29,2125,890],{"id":890},[12,2127,2128],{},"UUID 是软件开发中简单而强大的基础组件。它优雅地解决了\"如何在不协调的情况下生成唯一 ID\"这个问题。对于大多数应用，v4 已经足够。如果你在构建需要时间排序的日志或已知资源的确定性 ID，v1 或 v5 也各有其适用之处。",[12,2130,2131],{},[458,2132,2134],{"href":2133},"\u002Fzh\u002Ftools\u002Fuuid-generator",[21,2135,2136],{},"立即使用 ujiffy UUID 生成器 →",[468,2138,2139],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":288,"searchDepth":331,"depth":331,"links":2141},[2142,2143,2148,2149,2150,2151],{"id":1794,"depth":331,"text":1795},{"id":1824,"depth":331,"text":1825,"children":2144},[2145,2146,2147],{"id":1911,"depth":358,"text":1912},{"id":1922,"depth":358,"text":1923},{"id":1932,"depth":358,"text":1933},{"id":1939,"depth":331,"text":1940},{"id":1976,"depth":331,"text":1977},{"id":2010,"depth":331,"text":2011},{"id":890,"depth":331,"text":890},"了解 UUID 是什么、v1\u002Fv4\u002Fv5 的区别，以及如何免费在浏览器中即时生成无冲突的唯一 ID。",{},"\u002Fblog\u002Fzh-what-is-uuid-and-how-to-generate","uuid-generator",{"title":1782,"description":2152},"blog\u002Fzh-what-is-uuid-and-how-to-generate",[1800,2159,496,2160],"唯一标识符","UUID生成器","vRry5NsedOwVXBBlrikSFAq1pz5ZA30u8An3YlilpIk",{"id":2163,"title":2164,"author":7,"body":2165,"description":2498,"draft":482,"extension":483,"lang":484,"meta":2499,"navigation":486,"path":2500,"pubDate":2501,"relatedTool":2502,"seo":2503,"stem":2504,"tags":2505,"__hash__":2510},"blog\u002Fblog\u002Fzh-how-to-create-strong-passwords.mdx","如何创建强密码（以及为什么重要）",{"type":9,"value":2166,"toc":2485},[2167,2178,2181,2197,2200,2220,2223,2226,2229,2233,2239,2243,2246,2264,2267,2271,2282,2286,2289,2292,2295,2301,2318,2349,2358,2372,2375,2378,2381,2409,2412,2415,2419,2422,2465,2468,2470,2477],[12,2168,2169,2170,2173,2174,2177],{},"密码是你的账户和攻击者之间的第一道防线。然而，直到今天，仍有无数人在使用 ",[16,2171,2172],{},"123456","、",[16,2175,2176],{},"iloveyou"," 或者宠物名加感叹号这类密码。数据泄露事件比以往任何时候都更频繁，所以让我们来聊聊什么才算真正的强密码、要避免哪些错误，以及如何在几秒内生成一个安全的密码。",[29,2179,2180],{"id":2180},"为什么弱密码很危险",[12,2182,2183,2184,2173,2186,2173,2189,2192,2193,2196],{},"每年，安全研究人员都会公布最常用密码排行榜。年复一年，",[16,2185,2172],{},[16,2187,2188],{},"password",[16,2190,2191],{},"qwerty"," 稳居榜首。这些密码用自动化工具",[21,2194,2195],{},"不到一秒","就能破解。",[12,2198,2199],{},"攻击者通常使用以下手段入侵账户：",[71,2201,2202,2208,2214],{},[74,2203,2204,2207],{},[21,2205,2206],{},"暴力破解（Brute Force）","——逐一尝试所有可能的组合，直到找到正确的。",[74,2209,2210,2213],{},[21,2211,2212],{},"字典攻击（Dictionary Attack）","——使用包含常见单词、名字和已知密码的列表进行匹配。",[74,2215,2216,2219],{},[21,2217,2218],{},"撞库攻击（Credential Stuffing）","——将从某次泄露中获得的账号密码对，批量尝试登录其他网站。",[12,2221,2222],{},"如果你的密码短、可预测，或者在多个平台重复使用，你不只是\"有风险\"——你是最容易被盯上的目标。一个账户被攻破，往往会引发邮箱、银行、社交媒体的连锁沦陷。",[29,2224,2225],{"id":2225},"强密码的特征",[12,2227,2228],{},"强密码不只是\"难猜\"，它需要在机器每秒尝试数百万次的情况下仍然难以破解。以下几点至关重要：",[255,2230,2232],{"id":2231},"_1-长度","1. 长度",[12,2234,2235,2236],{},"长度是最重要的因素。每多一个字符，可能的组合数量就成指数级增长。12 位密码比 8 位密码难破解的程度是天文数字级别的。",[21,2237,2238],{},"重要账户建议至少使用 16 位。",[255,2240,2242],{"id":2241},"_2-字符多样性","2. 字符多样性",[12,2244,2245],{},"强密码应混合使用：",[71,2247,2248,2251,2254,2257],{},[74,2249,2250],{},"大写字母（A–Z）",[74,2252,2253],{},"小写字母（a–z）",[74,2255,2256],{},"数字（0–9）",[74,2258,2259,2260,2263],{},"特殊符号（",[16,2261,2262],{},"!@#$%^&*"," 等）",[12,2265,2266],{},"四类字符混合使用，会大幅增加攻击者的搜索空间。",[255,2268,2270],{"id":2269},"_3-随机性","3. 随机性",[12,2272,2273,2274,2277,2278,2281],{},"密码不应遵循任何规律。",[16,2275,2276],{},"P@ssw0rd"," 看起来很复杂，但它出现在每个破解工具的字典里，因为这是一种可预测的替换模式。你真正需要的是像 ",[16,2279,2280],{},"t7!Kx#mQpL2$vR"," 这样的真正随机字符串。",[255,2283,2285],{"id":2284},"_4-唯一性","4. 唯一性",[12,2287,2288],{},"不要在多个账户上使用同一个密码。一旦某个网站发生数据泄露，攻击者会立刻拿着这个密码去尝试你所有的其他账户。每个登录都应使用独立密码。",[29,2290,2291],{"id":2291},"常见的密码错误",[12,2293,2294],{},"即便是自认为很小心的人，也常常踩中同样的坑：",[12,2296,2297,2300],{},[21,2298,2299],{},"使用个人信息","\n生日、伴侣\u002F孩子\u002F宠物的名字、家庭住址——这些信息在社交媒体上都能找到，也是攻击者最先尝试的内容。",[12,2302,2303,2306,2173,2308,2173,2311,2173,2314,2317],{},[21,2304,2305],{},"键盘走位（Keyboard Walk）",[16,2307,2191],{},[16,2309,2310],{},"asdfgh",[16,2312,2313],{},"zxcvbn",[16,2315,2316],{},"1qaz2wsx","，这类序列打起来感觉很随机，实际上早就出现在每一份攻击字典里了。",[12,2319,2320,2323,2324,2326,2327,643,2329,2326,2332,643,2335,2326,2338,2341,2342,2344,2345,2348],{},[21,2321,2322],{},"简单字符替换","\n把 ",[16,2325,458],{}," 换成 ",[16,2328,1551],{},[16,2330,2331],{},"o",[16,2333,2334],{},"0",[16,2336,2337],{},"e",[16,2339,2340],{},"3","，这种技巧破解工具早就会自动处理了。",[16,2343,2276],{}," 并不比 ",[16,2346,2347],{},"Password"," 安全多少。",[12,2350,2351,2354,2357],{},[21,2352,2353],{},"只在末尾加数字或符号",[16,2355,2356],{},"Summer2024!"," 是一种典型的可识别模式，这种可预测的结构完全抵消了复杂度的意义。",[12,2359,2360,2363,2364,2367,2368,2371],{},[21,2361,2362],{},"重复使用密码只改一点","\n如果你习惯用 ",[16,2365,2366],{},"BlueSky42","，明年换成 ",[16,2369,2370],{},"BlueSky43"," 并不会保护你。破解了一个变体的攻击者会立刻尝试相邻变体。",[29,2373,2374],{"id":2374},"如何即时生成强密码",[12,2376,2377],{},"获得强密码最简单的方式，是使用生成工具——而不是自己想一个。人脑很不擅长真正的随机性，我们总是在不知不觉中遵循某种规律。",[12,2379,2380],{},"ujiffy 的免费密码生成器让你可以：",[71,2382,2383,2390,2397,2403],{},[74,2384,2385,2386,2389],{},"设置所需的",[21,2387,2388],{},"密码长度","（推荐 16 位以上）",[74,2391,2392,2393,2396],{},"选择包含哪些",[21,2394,2395],{},"字符类型","（大写、小写、数字、符号）",[74,2398,2399,2402],{},[21,2400,2401],{},"即时在浏览器中","生成随机密码",[74,2404,2405,2406],{},"一键",[21,2407,2408],{},"复制到剪贴板",[12,2410,2411],{},"无需注册账号，不向服务器发送任何数据，所有操作都在你的浏览器本地完成。",[12,2413,2414],{},"生成强密码后，将其保存到密码管理器中（如 Bitwarden、1Password 或浏览器内置的管理器）。你不需要记住它——只需确保它被安全存储。",[29,2416,2418],{"id":2417},"快速检查你的密码够强吗","快速检查：你的密码够强吗？",[12,2420,2421],{},"在确定一个密码之前，过一遍这份清单：",[71,2423,2426,2435,2441,2447,2453,2459],{"className":2424},[2425],"contains-task-list",[74,2427,2430,2434],{"className":2428},[2429],"task-list-item",[2431,2432],"input",{"disabled":486,"type":2433},"checkbox"," 至少 16 位长",[74,2436,2438,2440],{"className":2437},[2429],[2431,2439],{"disabled":486,"type":2433}," 包含大写字母、小写字母、数字和符号",[74,2442,2444,2446],{"className":2443},[2429],[2431,2445],{"disabled":486,"type":2433}," 不含你的姓名、生日或任何个人信息",[74,2448,2450,2452],{"className":2449},[2429],[2431,2451],{"disabled":486,"type":2433}," 不是字典词汇或常见短语",[74,2454,2456,2458],{"className":2455},[2429],[2431,2457],{"disabled":486,"type":2433}," 没有在其他账户上重复使用",[74,2460,2462,2464],{"className":2461},[2429],[2431,2463],{"disabled":486,"type":2433}," 通过工具随机生成（而非自己想的）",[12,2466,2467],{},"六条全部勾选，你就很安全了。",[29,2469,890],{"id":890},[12,2471,2472,2473,2476],{},"创建强密码其实并不复杂，关键的认知只有一个：",[21,2474,2475],{},"不要自己发明密码","。使用生成工具获取真正随机的密码，然后用密码管理器来记住它。\"随机生成 + 安全存储\"这个组合，是 2025 年密码安全的黄金标准。",[12,2478,2479],{},[458,2480,2482],{"href":2481},"\u002Fzh\u002Ftools\u002Fpassword-generator",[21,2483,2484],{},"立即使用 ujiffy 密码生成器 →",{"title":288,"searchDepth":331,"depth":331,"links":2486},[2487,2488,2494,2495,2496,2497],{"id":2180,"depth":331,"text":2180},{"id":2225,"depth":331,"text":2225,"children":2489},[2490,2491,2492,2493],{"id":2231,"depth":358,"text":2232},{"id":2241,"depth":358,"text":2242},{"id":2269,"depth":358,"text":2270},{"id":2284,"depth":358,"text":2285},{"id":2291,"depth":331,"text":2291},{"id":2374,"depth":331,"text":2374},{"id":2417,"depth":331,"text":2418},{"id":890,"depth":331,"text":890},"了解什么让密码真正安全、常见错误以及如何使用 ujiffy 免费工具即时生成强密码。",{},"\u002Fblog\u002Fzh-how-to-create-strong-passwords","2025-05-12","password-generator",{"title":2164,"description":2498},"blog\u002Fzh-how-to-create-strong-passwords",[2506,2507,2508,2509],"密码","安全","在线工具","密码生成器","DZLzUHg-VtvWZxV6x5NdPUFcX-RIP9bxUD1x3bd035Q",{"id":2512,"title":2513,"author":7,"body":2514,"description":2682,"draft":482,"extension":483,"lang":484,"meta":2683,"navigation":486,"path":2684,"pubDate":2685,"relatedTool":2502,"seo":2686,"stem":2687,"tags":2688,"__hash__":2689},"blog\u002Fblog\u002Fzh-generate-secure-passwords-online.mdx","如何在线生成安全密码",{"type":9,"value":2515,"toc":2675},[2516,2519,2522,2525,2529,2532,2538,2552,2561,2567,2570,2596,2600,2603,2629,2632,2635,2638,2664,2666,2669],[29,2517,2518],{"id":2518},"为什么密码安全不容忽视",[12,2520,2521],{},"数据泄露每天都在发生。仅 2024 年，就有数十亿条账号凭据在各类泄露事件中曝光，波及从社交媒体到金融机构的众多服务。残酷的现实是：一旦你在多个平台复用弱密码，任意一次泄露都可能引发连锁账号被盗。",[12,2523,2524],{},"强大且唯一的密码是你的第一道——也往往是最有效的——防线。",[29,2526,2528],{"id":2527},"什么是强密码","什么是\"强密码\"？",[12,2530,2531],{},"一个强密码具备四个关键特征：",[12,2533,2534,2537],{},[21,2535,2536],{},"长度"," —— 至少 12 位字符；16 位或更长会显著提升安全性。每增加一位字符，暴力破解需要尝试的组合数就会呈指数级增长。",[12,2539,2540,2543,2544,2547,2548,2551],{},[21,2541,2542],{},"随机性"," —— 人为选择的密码往往可以预测。我们倾向于使用单词、名字、键盘规律（",[16,2545,2546],{},"qwerty123","）和字符替换（",[16,2549,2550],{},"p@ssw0rd","），而这些都是攻击者首先会尝试的。真正的随机性能彻底消除这种可预测性。",[12,2553,2554,2557,2558,2560],{},[21,2555,2556],{},"字符多样性"," —— 混合使用大写字母、小写字母、数字和符号（",[16,2559,2262],{},"），能大幅扩展破解算法的搜索空间。",[12,2562,2563,2566],{},[21,2564,2565],{},"唯一性"," —— 每个账号应使用不同的密码。一旦某个网站的数据库被攻破，撞库攻击就无法影响你的其他账号。",[29,2568,2569],{"id":2569},"你应该了解的常见密码攻击方式",[71,2571,2572,2578,2584,2590],{},[74,2573,2574,2577],{},[21,2575,2576],{},"暴力破解"," —— 穷举所有可能的组合。字符集有限的短密码在数秒内即可被破解。",[74,2579,2580,2583],{},[21,2581,2582],{},"字典攻击"," —— 使用常见单词、短语及已知泄露密码的列表进行尝试。",[74,2585,2586,2589],{},[21,2587,2588],{},"撞库攻击"," —— 利用一次泄露获得的用户名和密码，尝试登录其他服务。",[74,2591,2592,2595],{},[21,2593,2594],{},"钓鱼攻击"," —— 诱骗你在伪造网站上输入密码。强密码对此无能为力——请使用密码管理器并仔细核对网址。",[29,2597,2599],{"id":2598},"如何使用-ujiffy-密码生成器","如何使用 ujiffy 密码生成器",[12,2601,2602],{},"ujiffy 的密码生成器完全在浏览器中通过加密随机算法生成密码：",[1185,2604,2605,2611,2617,2623],{},[74,2606,2607,2610],{},[21,2608,2609],{},"设置长度"," —— 拖动滑块或直接输入数字。建议至少 16 位。",[74,2612,2613,2616],{},[21,2614,2615],{},"选择字符集"," —— 按需开启或关闭大写字母、小写字母、数字和符号。",[74,2618,2619,2622],{},[21,2620,2621],{},"点击「生成」"," —— 立即得到一个新的随机密码。",[74,2624,2625,2628],{},[21,2626,2627],{},"一键复制"," —— 直接粘贴到你的密码管理器中。",[12,2630,2631],{},"由于生成过程完全在浏览器内通过 Web Crypto API 完成，密码不会上传到任何服务器，无任何日志记录，无任何拦截风险。",[29,2633,2634],{"id":2634},"生成强密码之后的最佳实践",[12,2636,2637],{},"生成强密码只是第一步，接下来还需要：",[71,2639,2640,2646,2652,2658],{},[74,2641,2642,2645],{},[21,2643,2644],{},"存入密码管理器","（如 Bitwarden、1Password 等）——不要试图靠记忆。",[74,2647,2648,2651],{},[21,2649,2650],{},"尽可能开启双重认证（2FA）","，为账号增加第二层保护。",[74,2653,2654,2657],{},[21,2655,2656],{},"切勿通过邮件、聊天或短信分享密码"," —— 如确有必要，请使用密码管理器的安全分享功能。",[74,2659,2660,2663],{},[21,2661,2662],{},"定期更换关键账号密码","（邮箱、银行等）——至少每年一次，或在任何疑似泄露后立即更换。",[450,2665],{},[12,2667,2668],{},"你的账号安全取决于最薄弱的那个密码。让 ujiffy 来处理随机性，让你专注于更重要的事。",[12,2670,2671],{},[458,2672,2673],{"href":2481},[21,2674,2484],{},{"title":288,"searchDepth":331,"depth":331,"links":2676},[2677,2678,2679,2680,2681],{"id":2518,"depth":331,"text":2518},{"id":2527,"depth":331,"text":2528},{"id":2569,"depth":331,"text":2569},{"id":2598,"depth":331,"text":2599},{"id":2634,"depth":331,"text":2634},"了解什么才是真正安全的密码，掌握常见攻击手段，并通过 ujiffy 的免费密码生成器即时生成高强度随机密码。",{},"\u002Fblog\u002Fzh-generate-secure-passwords-online","2025-05-05",{"title":2513,"description":2682},"blog\u002Fzh-generate-secure-passwords-online",[2506,2507],"TPjN_ujzQWGFVhcAOavla3SjHzRtP57wV1HhYddWBUA",{"id":2691,"title":2692,"author":7,"body":2693,"description":2902,"draft":482,"extension":483,"lang":484,"meta":2903,"navigation":486,"path":2904,"pubDate":2905,"relatedTool":2906,"seo":2907,"stem":2908,"tags":2909,"__hash__":2912},"blog\u002Fblog\u002Fzh-how-to-format-json-online.mdx","如何在线格式化 JSON（免费工具）",{"type":9,"value":2694,"toc":2895},[2695,2699,2702,2705,2725,2729,2738,2752,2760,2768,2772,2775,2801,2804,2808,2811,2855,2858,2862,2882,2884,2887],[29,2696,2698],{"id":2697},"为什么-json-格式化很重要","为什么 JSON 格式化很重要",[12,2700,2701],{},"JSON（JavaScript Object Notation）是现代 API 和数据交换的基础格式。但原始 JSON——尤其是来自网络响应或数据库导出的数据——往往是没有任何空白字符的单行压缩文本，阅读和调试起来非常痛苦。",[12,2703,2704],{},"格式化 JSON 的意义在于添加统一的缩进和换行，让结构一目了然。格式良好的 JSON 文件让你能够：",[71,2706,2707,2713,2719],{},[74,2708,2709,2712],{},[21,2710,2711],{},"更快发现错误"," —— 括号不匹配、缺少逗号、数据类型有误，一眼就能看出来。",[74,2714,2715,2718],{},[21,2716,2717],{},"理解嵌套结构"," —— 深层嵌套的对象和数组变得清晰可读。",[74,2720,2721,2724],{},[21,2722,2723],{},"便于分享和评审"," —— 格式化后的 JSON 在代码评审或文档中更容易讨论。",[29,2726,2728],{"id":2727},"常见需要-json-格式化工具的场景","常见需要 JSON 格式化工具的场景",[12,2730,2731,2734,2737],{},[21,2732,2733],{},"1. 调试 API 响应",[2735,2736],"br",{},"\n你从 Postman 或浏览器网络面板粘贴了一段原始响应，需要快速看清服务端究竟返回了什么。",[12,2739,2740,2743,2745,2173,2748,2751],{},[21,2741,2742],{},"2. 处理配置文件",[2735,2744],{},[16,2746,2747],{},"package.json",[16,2749,2750],{},"tsconfig.json","、AWS IAM 策略——JSON 配置文件应该具有良好的可读性和统一的缩进。",[12,2753,2754,2757,2759],{},[21,2755,2756],{},"3. 对比 JSON 数据",[2735,2758],{},"\n在对比两段 JSON 之前，先把两者都格式化，避免空白差异掩盖真正的内容变化。",[12,2761,2762,2765,2767],{},[21,2763,2764],{},"4. 还原压缩后的生产环境输出",[2735,2766],{},"\n压缩 JSON 可以减小传输体积，但本地调试时需要将其还原为可读格式。",[29,2769,2771],{"id":2770},"如何使用-ujiffy-json-格式化工具","如何使用 ujiffy JSON 格式化工具",[12,2773,2774],{},"ujiffy 的 JSON 格式化工具完全免费，基于浏览器运行，无需注册：",[1185,2776,2777,2783,2789,2795],{},[74,2778,2779,2782],{},[21,2780,2781],{},"粘贴 JSON","——将任意 JSON 内容粘贴到输入框，不论格式多乱都可以。",[74,2784,2785,2788],{},[21,2786,2787],{},"点击「格式化」","——工具立即输出带有 2 空格缩进的整洁 JSON。",[74,2790,2791,2794],{},[21,2792,2793],{},"可选压缩","——切换「压缩」选项，将 JSON 还原为单行，适合生产环境使用。",[74,2796,2797,2800],{},[21,2798,2799],{},"一键复制或下载","结果。",[12,2802,2803],{},"所有操作都在你的浏览器中完成，数据不会上传到任何服务器——在处理含有 API 密钥或私密数据时尤为重要。",[29,2805,2807],{"id":2806},"格式化-vs-验证-vs-压缩","格式化 vs 验证 vs 压缩",[12,2809,2810],{},"了解这三种操作的区别很有帮助：",[172,2812,2813,2823],{},[175,2814,2815],{},[178,2816,2817,2820],{},[181,2818,2819],{},"操作",[181,2821,2822],{},"功能说明",[188,2824,2825,2835,2845],{},[178,2826,2827,2832],{},[193,2828,2829],{},[21,2830,2831],{},"格式化",[193,2833,2834],{},"添加缩进和换行，提升可读性",[178,2836,2837,2842],{},[193,2838,2839],{},[21,2840,2841],{},"压缩",[193,2843,2844],{},"去除所有多余空白，缩小体积",[178,2846,2847,2852],{},[193,2848,2849],{},[21,2850,2851],{},"验证",[193,2853,2854],{},"检查 JSON 语法是否正确",[12,2856,2857],{},"ujiffy 的 JSON 格式化工具在同一个界面完成上述三种操作。",[29,2859,2861],{"id":2860},"json-编写小技巧","JSON 编写小技巧",[71,2863,2864,2867,2870],{},[74,2865,2866],{},"键名始终使用双引号——单引号不是合法的 JSON 语法。",[74,2868,2869],{},"标准 JSON 不允许末尾多余的逗号（虽然部分解析器会容忍）。",[74,2871,2872,2173,2875,2173,2878,2881],{},[16,2873,2874],{},"null",[16,2876,2877],{},"true",[16,2879,2880],{},"false"," 是小写关键字，不是字符串。",[450,2883],{},[12,2885,2886],{},"准备好格式化你的 JSON 了吗？试试下面的工具——粘贴即可一键美化。",[12,2888,2889],{},[458,2890,2892],{"href":2891},"\u002Fzh\u002Ftools\u002Fjson-formatter",[21,2893,2894],{},"立即使用 ujiffy JSON 格式化工具 →",{"title":288,"searchDepth":331,"depth":331,"links":2896},[2897,2898,2899,2900,2901],{"id":2697,"depth":331,"text":2698},{"id":2727,"depth":331,"text":2728},{"id":2770,"depth":331,"text":2771},{"id":2806,"depth":331,"text":2807},{"id":2860,"depth":331,"text":2861},"了解 JSON 格式化的重要性、适用场景，以及如何使用 ujiffy 的免费 JSON 格式化工具一键美化或压缩 JSON——无需注册。",{},"\u002Fblog\u002Fzh-how-to-format-json-online","2025-05-01","json-formatter",{"title":2692,"description":2902},"blog\u002Fzh-how-to-format-json-online",[2910,2911],"json","开发工具","qux1dMtT3G1r6guEIHyySvuAhAHa8O496hmxcH7s1b8",1778831412572]