{"id":3300,"date":"2026-10-10T16:01:56","date_gmt":"2026-10-10T08:01:56","guid":{"rendered":"https:\/\/randengzhe.cn\/wordpress\/?p=3300"},"modified":"2026-10-10T16:01:59","modified_gmt":"2026-10-10T08:01:59","slug":"zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101","status":"publish","type":"post","link":"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/","title":{"rendered":"\u6307\u7eb9\u6bd4\u5bf9\u7cfb\u7edf\u8bbe\u8ba1\u65b9\u6848\uff08\u4fee\u8ba2\u7248 v1.01\uff09"},"content":{"rendered":"<div class=\"gfmr-markdown-container\"><div class=\"gfmr-markdown-rendered\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\r\n<div class=\"ez-toc-title-container\">\r\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\r\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\r\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%8C%87%E7%BA%B9%E6%AF%94%E5%AF%B9%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88%EF%BC%88%E4%BF%AE%E8%AE%A2%E7%89%88_v101%EF%BC%89\" >\u6307\u7eb9\u6bd4\u5bf9\u7cfb\u7edf\u8bbe\u8ba1\u65b9\u6848\uff08\u4fee\u8ba2\u7248 v1.01\uff09<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#1_%E9%A1%B9%E7%9B%AE%E6%A6%82%E8%BF%B0\" >1 \u9879\u76ee\u6982\u8ff0<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#11_%E9%9C%80%E6%B1%82\" >1.1 \u9700\u6c42<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#12_%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E8%81%94%E5%8A%A8%E8%AF%B4%E6%98%8E\" >1.2 \u6570\u5b57\u8eab\u4efd\u8054\u52a8\u8bf4\u660e<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#2_%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%EF%BC%88%E5%88%86%E5%B1%82%EF%BC%89\" >2 \u603b\u4f53\u67b6\u6784\uff08\u5206\u5c42\uff09<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%A8%A1%E5%9D%97%E8%81%8C%E8%B4%A3\" >\u6a21\u5757\u804c\u8d23<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#3_%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%88C%EF%BC%89\" >3 \u6838\u5fc3\u6570\u636e\u7ed3\u6784\uff08C++\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#4_%E6%A0%B8%E5%BF%83%E7%AE%97%E6%B3%95%E4%BC%AA%E4%BB%A3%E7%A0%81_C_%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF\" >4 \u6838\u5fc3\u7b97\u6cd5\u4f2a\u4ee3\u7801 + C++ \u5b9e\u73b0\u601d\u8def<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#41_1_1_%E6%AF%94%E5%AF%B9%E5%87%BD%E6%95%B0\" >4.1 1:1 \u6bd4\u5bf9\u51fd\u6570<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#42_1_N_%E6%A3%80%E7%B4%A2%EF%BC%88%E5%87%A0%E5%8D%83%E6%9D%A1%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88%EF%BC%89\" >4.2 1:N \u68c0\u7d22\uff08\u51e0\u5343\u6761\u4f18\u5316\u65b9\u6848\uff09<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#5_%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E8%81%94%E5%8A%A8%E6%B5%81%E7%A8%8B%EF%BC%882_%E7%A7%8D%E4%B8%9A%E5%8A%A1%E6%A8%A1%E5%BC%8F%EF%BC%89\" >5 \u6570\u5b57\u8eab\u4efd\u8054\u52a8\u6d41\u7a0b\uff082 \u79cd\u4e1a\u52a1\u6a21\u5f0f\uff09<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%A8%A1%E5%BC%8F_A%EF%BC%9A%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E5%85%88%E8%A1%8C%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%8CMFA_%E5%8F%8C%E5%9B%A0%E5%AD%90%E8%AE%A4%E8%AF%81%EF%BC%89\" >\u6a21\u5f0f A\uff1a\u6570\u5b57\u8eab\u4efd\u5148\u884c\uff08\u63a8\u8350\uff0cMFA \u53cc\u56e0\u5b50\u8ba4\u8bc1\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%A8%A1%E5%BC%8F_B%EF%BC%9A%E6%8C%87%E7%BA%B9%E5%85%88%E8%A1%8C%E6%A3%80%E7%B4%A2\" >\u6a21\u5f0f B\uff1a\u6307\u7eb9\u5148\u884c\u68c0\u7d22<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#6_%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%EF%BC%88Linux%EF%BC%8C%E6%8E%A8%E8%8D%90_SQLite_%E6%88%96_MySQL%EF%BC%89\" >6 \u6570\u636e\u5e93\u8bbe\u8ba1\uff08Linux\uff0c\u63a8\u8350 SQLite \u6216 MySQL\uff09<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#person_%E4%BA%BA%E5%91%98%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E6%98%A0%E5%B0%84%E8%A1%A8\" >person \u4eba\u5458\u6570\u5b57\u8eab\u4efd\u6620\u5c04\u8868<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#fp_template_%E6%8C%87%E7%BA%B9%E6%A8%A1%E6%9D%BF%E8%A1%A8\" >fp_template \u6307\u7eb9\u6a21\u677f\u8868<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#fp_audit_log_%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%E8%A1%A8\" >fp_audit_log \u5ba1\u8ba1\u65e5\u5fd7\u8868<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#7_C_%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84%EF%BC%88Linux%EF%BC%89\" >7 C++ \u5de5\u7a0b\u7ed3\u6784\uff08Linux\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#8_%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1%EF%BC%88%E4%B8%A4%E7%A7%8D%E5%8F%AF%E9%80%89%EF%BC%89\" >8 \u63a5\u53e3\u8bbe\u8ba1\uff08\u4e24\u79cd\u53ef\u9009\uff09<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%96%B9%E6%A1%88_1%EF%BC%9A%E6%9C%AC%E5%9C%B0_IPC%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%8C%E5%86%85%E7%BD%91_%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1%EF%BC%8C%E8%BD%BB%E9%87%8F%EF%BC%89\" >\u65b9\u6848 1\uff1a\u672c\u5730 IPC\uff08\u63a8\u8350\uff0c\u5185\u7f51 \/ \u672c\u5730\u670d\u52a1\uff0c\u8f7b\u91cf\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#%E6%96%B9%E6%A1%88_2%EF%BC%9AHTTP%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%8C%E8%B7%A8%E4%B8%BB%E6%9C%BA%E8%B0%83%E7%94%A8%EF%BC%89\" >\u65b9\u6848 2\uff1aHTTP\uff08\u53ef\u9009\uff0c\u8de8\u4e3b\u673a\u8c03\u7528\uff09<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#9_%E5%AE%89%E5%85%A8%E8%AE%BE%E8%AE%A1%EF%BC%88%E7%BB%93%E5%90%88%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%EF%BC%89\" >9 \u5b89\u5168\u8bbe\u8ba1\uff08\u7ed3\u5408\u6570\u5b57\u8eab\u4efd\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#10_%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%A4%BA%E4%BE%8B_fp_configini\" >10 \u914d\u7f6e\u6587\u4ef6\u793a\u4f8b fp_config.ini<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#11_%E6%B5%8B%E8%AF%95%E6%96%B9%E6%A1%88\" >11 \u6d4b\u8bd5\u65b9\u6848<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#12_%E6%89%A9%E5%B1%95%E4%B8%8E%E9%A3%8E%E9%99%A9\" >12 \u6269\u5c55\u4e0e\u98ce\u9669<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/randengzhe.cn\/wordpress\/zhi-wen-bi-dui-xi-tong-she-ji-fang-an-xiu-ding-ban-v101\/#13_%E4%BA%A4%E4%BB%98%E7%89%A9%E6%B8%85%E5%8D%95\" >13 \u4ea4\u4ed8\u7269\u6e05\u5355<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\r\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%8C%87%E7%BA%B9%E6%AF%94%E5%AF%B9%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88%EF%BC%88%E4%BF%AE%E8%AE%A2%E7%89%88_v101%EF%BC%89\"><\/span>\u6307\u7eb9\u6bd4\u5bf9\u7cfb\u7edf\u8bbe\u8ba1\u65b9\u6848\uff08\u4fee\u8ba2\u7248 v1.01\uff09<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8fd0\u884c\u73af\u5883<\/strong>\uff1aLinux\uff08Ubuntu \/ \u9e92\u9e9f V10 \/ TencentOS\uff09 <strong>\u5f00\u53d1\u8bed\u8a00<\/strong>\uff1aC++11 \u53ca\u4ee5\u4e0a <strong>\u89c4\u6a21<\/strong>\uff1a\u6307\u7eb9\u6a21\u677f\u5e93\u51e0\u5343\u6761\uff08&lt;10000\uff09 <strong>\u914d\u5957\u80fd\u529b<\/strong>\uff1a\u4e0e\u6570\u5b57\u8eab\u4efd\u8ba4\u8bc1\u4f53\u7cfb\u8054\u52a8 <strong>\u6587\u6863\u7528\u9014<\/strong>\uff1a\u5de5\u7a0b\u5f00\u53d1\u3001\u65b9\u6848\u8bc4\u5ba1\uff0c\u53ef\u76f4\u63a5\u5bfc\u5165 Obsidian<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_%E9%A1%B9%E7%9B%AE%E6%A6%82%E8%BF%B0\"><\/span>1 \u9879\u76ee\u6982\u8ff0<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_%E9%9C%80%E6%B1%82\"><\/span>1.1 \u9700\u6c42<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6307\u7eb9\u80fd\u529b\uff1a<strong>1:1 \u6838\u9a8c\u30011:N \u68c0\u7d22<\/strong>\uff0c\u51e0\u5343\u6a21\u677f\u91cf\u7ea7\uff0c\u5355\u673a\u79bb\u7ebf\u53ef\u8fd0\u884c\uff1b<\/li>\n\n\n\n<li>\u5e73\u53f0\uff1aLinux C++ \u670d\u52a1\u7a0b\u5e8f\uff0c\u65e0\u5f3a\u4f9d\u8d56\u5927\u578b\u4e2d\u95f4\u4ef6\uff1b<\/li>\n\n\n\n<li>\u8054\u52a8\u6570\u5b57\u8eab\u4efd\uff1a\u6307\u7eb9\u4f5c\u4e3a<strong>\u751f\u7269\u56e0\u5b50<\/strong>\uff0c\u548c\u6570\u5b57\u8eab\u4efd\uff08LDAP \/ \u8d26\u53f7\u8bc1\u4e66\uff09\u505a\u591a\u56e0\u7d20\u8ba4\u8bc1\uff1b<\/li>\n\n\n\n<li>\u9690\u79c1\u7ea6\u675f\uff1a<strong>\u4e0d\u6301\u4e45\u5316\u539f\u59cb\u6307\u7eb9\u56fe\u50cf<\/strong>\uff0c\u4ec5\u5b58\u50a8\u7ecf\u8fc7\u53d8\u6362\u7684\u6307\u7eb9\u7ec6\u8282\u70b9\u6a21\u677f\uff1b<\/li>\n\n\n\n<li>\u6027\u80fd\u6307\u6807\uff08\u51e0\u5343\u6a21\u677f\uff09\n<ul class=\"wp-block-list\">\n<li>1:1 \u6bd4\u5bf9\uff1a\u2264150ms<\/li>\n\n\n\n<li>1:N\uff08\u226410000 \u6a21\u677f\uff09\uff1a\u5355\u6b21\u68c0\u7d22 \u2264800ms<\/li>\n\n\n\n<li>FRR \u22641%\uff0cFAR \u22640.001%\uff0c\u9608\u503c\u914d\u7f6e\u6587\u4ef6\u53ef\u52a8\u6001\u8c03\u6574<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5b89\u5168\u5ba1\u8ba1\uff1a\u6240\u6709\u6bd4\u5bf9\u3001\u6ce8\u518c\u64cd\u4f5c\u65e5\u5fd7\u843d\u76d8\uff0c\u4e0d\u53ef\u968f\u610f\u7be1\u6539\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E8%81%94%E5%8A%A8%E8%AF%B4%E6%98%8E\"><\/span>1.2 \u6570\u5b57\u8eab\u4efd\u8054\u52a8\u8bf4\u660e<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6570\u5b57\u8eab\u4efd\u4e3a\u4e3b\u4f53\uff0c\u6307\u7eb9\u662f<strong>\u7b2c\u4e8c\u8ba4\u8bc1\u56e0\u5b50<\/strong>\uff0c\u5178\u578b\u6d41\u7a0b\uff1a \u7528\u6237\u5148\u4f7f\u7528\u6570\u5b57\u8eab\u4efd\uff08\u8d26\u53f7 \/ \u8bc1\u4e66\uff09\u5b8c\u6210\u7b2c\u4e00\u5c42\u8eab\u4efd\u9274\u6743\uff1b\u518d\u91c7\u96c6\u6307\u7eb9\u505a\u751f\u7269\u6838\u9a8c\uff0c\u53cc\u56e0\u5b50\u901a\u8fc7\u624d\u6388\u4e88\u6743\u9650\u3002 \u4e5f\u652f\u6301\u53cd\u5411\uff1a\u5148\u6307\u7eb9 1:N \u68c0\u7d22\u5f97\u5230\u4eba\u5458 ID\uff0c\u518d\u62c9\u53d6\u8be5 ID \u5bf9\u5e94\u7684\u6570\u5b57\u8eab\u4efd\u4fe1\u606f\u505a\u6743\u9650\u6821\u9a8c\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%EF%BC%88%E5%88%86%E5%B1%82%EF%BC%89\"><\/span>2 \u603b\u4f53\u67b6\u6784\uff08\u5206\u5c42\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u6570\u5b57\u8eab\u4efd\u5bf9\u63a5\u5c42\uff08LDAP\/\u672c\u5730\u8eab\u4efd\u5e93\uff09         \u2502 \u2190 \u5916\u90e8\u6570\u5b57\u8eab\u4efd\u7cfb\u7edf\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u4e1a\u52a1\u670d\u52a1\u5c42\uff08C++\u4e3b\u7a0b\u5e8f\uff09API\u3001\u6a21\u677f\u7ba1\u7406\u3001\u65e5\u5fd7 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u6307\u7eb9\u5f15\u64ce\u5c42\uff08C++\u6838\u5fc3\u5e93\uff09\u91c7\u96c6\u3001\u9884\u5904\u7406\u3001\u7279\u5f81\u3001\u6bd4\u5bf9 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u8bbe\u5907\u9a71\u52a8\u5c42\uff08\u6307\u7eb9\u4f20\u611f\u5668SDK\uff09USB\/\u4e32\u53e3\u6307\u7eb9\u5934 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A8%A1%E5%9D%97%E8%81%8C%E8%B4%A3\"><\/span>\u6a21\u5757\u804c\u8d23<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8bbe\u5907\u9a71\u52a8\u5c42<\/strong>\n<ul class=\"wp-block-list\">\n<li>Linux \u4e0b\u8c03\u7528\u6307\u7eb9\u5382\u5546 SDK\uff0c\u8bfb\u53d6\u7070\u5ea6\u6307\u7eb9\u56fe\uff1b<\/li>\n\n\n\n<li>\u91c7\u96c6\u65f6\u505a\u56fe\u50cf\u8d28\u91cf\u8bc4\u4f30\uff0c\u4f4e\u8d28\u91cf\u56fe\u50cf\u76f4\u63a5\u4e22\u5f03\uff1b<\/li>\n\n\n\n<li>\u8f93\u51fa\uff1a8bit \u7070\u5ea6\u56fe\uff08\u5185\u5b58\u4e2d\u4e34\u65f6\u5b58\u5728\uff0c\u5904\u7406\u5b8c\u91ca\u653e\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6307\u7eb9\u5f15\u64ce\u5c42\uff08\u72ec\u7acb C++ \u9759\u6001\u5e93 libfingerprint.so\uff09<\/strong><ul><li>\u56fe\u50cf\u9884\u5904\u7406\u6a21\u5757\uff1a\u7070\u5ea6\u5f52\u4e00\u3001Gabor \u589e\u5f3a\u3001\u4e8c\u503c\u5316\u3001\u7ec6\u5316\u3001ROI\uff1b<\/li><li>\u7279\u5f81\u63d0\u53d6\u6a21\u5757\uff1a\u65b9\u5411\u573a\u4f30\u8ba1\u3001\u7ec6\u8282\u70b9\u63d0\u53d6\u3001\u4f2a\u7ec6\u8282\u70b9\u8fc7\u6ee4\uff0c\u8f93\u51fa\u4e8c\u8fdb\u5236\u6a21\u677f\uff1b<\/li><li>\u6bd4\u5bf9\u5f15\u64ce\u6a21\u5757\uff1a\u6a21\u677f\u7a7a\u95f4\u53d8\u6362\u3001\u7ec6\u8282\u70b9\u914d\u5bf9\u3001\u76f8\u4f3c\u5ea6\u6253\u5206\u3001\u9608\u503c\u5224\u51b3\uff1b<\/li><\/ul>\u5f15\u64ce\u505a\u6210\u72ec\u7acb so \u5e93\uff0c\u65b9\u4fbf\u5355\u5143\u6d4b\u8bd5\u3001\u4e1a\u52a1\u5c42\u89e3\u8026\u3002<\/li>\n\n\n\n<li><strong>\u4e1a\u52a1\u670d\u52a1\u5c42\uff08C++ Service\uff09<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u6a21\u677f\u7ba1\u7406\uff1a\u6ce8\u518c\u3001\u67e5\u8be2\u3001\u5220\u9664\u6307\u7eb9\u6a21\u677f\uff1b<\/li>\n\n\n\n<li>\u5bf9\u5916\u63a5\u53e3\uff1a\u672c\u5730 IPC \/ HTTP\uff08\u53ef\u9009\uff09\uff0c\u4f9b\u6570\u5b57\u8eab\u4efd\u6a21\u5757\u8c03\u7528\uff1b<\/li>\n\n\n\n<li>\u7f13\u5b58\uff1a\u51e0\u5343\u6a21\u677f\u53ef\u52a0\u8f7d\u5230\u5185\u5b58\u7f13\u5b58\uff0c\u52a0\u901f 1:N \u68c0\u7d22\uff0c\u51cf\u5c11\u6570\u636e\u5e93 IO\uff1b<\/li>\n\n\n\n<li>\u5ba1\u8ba1\u65e5\u5fd7\u6a21\u5757\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6570\u5b57\u8eab\u4efd\u5bf9\u63a5\u5c42<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5bf9\u63a5 OpenLDAP \/ FreeRADIUS \/ \u672c\u5730\u6570\u5b57\u8eab\u4efd\u6570\u636e\u5e93\uff1b<\/li>\n\n\n\n<li>\u6620\u5c04\u5173\u7cfb\uff1a<code>person_id \u2194 \u6570\u5b57\u8eab\u4efd\u552f\u4e00DN\/UUID<\/code>\uff1b<\/li>\n\n\n\n<li>\u8ba4\u8bc1\u7f16\u6392\uff1a\u5b9e\u73b0\u300c\u6570\u5b57\u8eab\u4efd + \u6307\u7eb9\u300d\u53cc\u56e0\u7d20\u8ba4\u8bc1\u903b\u8f91\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%88C%EF%BC%89\"><\/span>3 \u6838\u5fc3\u6570\u636e\u7ed3\u6784\uff08C++\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u6307\u7eb9\u7ec6\u8282\u70b9\nstruct MinutiaPoint {\n    int x;\n    int y;\n    float angle;    \/\/ \u89d2\u5ea6\uff0c0~360\u00b0\n    enum Type { END, BIFURCATION } type;\n};\n\n\/\/ \u6307\u7eb9\u6a21\u677f\uff08\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u5b58\u50a8\uff0c\u4e0d\u5b58\u539f\u56fe\uff09\nstruct FpTemplate {\n    std::string template_uuid;\n    std::string person_id;      \/\/ \u5173\u8054\u6570\u5b57\u8eab\u4efd\u552f\u4e00\u6807\u8bc6\n    std::vector&lt;MinutiaPoint&gt; minutiae;\n    int quality_score;          \/\/ \u6ce8\u518c\u56fe\u50cf\u8d28\u91cf\u5206 0~100\n    uint64_t register_ts;\n};\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u5e8f\u5217\u5316\u65b9\u6848\uff1aC++ Protobuf \/ \u81ea\u5b9a\u4e49\u4e8c\u8fdb\u5236\u6253\u5305\uff0c\u63a8\u8350 Protobuf\uff0c\u65b9\u4fbf\u5e8f\u5217\u5316\u3001\u6821\u9a8c\uff0c\u6613\u4e8e\u5b58\u5165 BLOB \u5b57\u6bb5\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_%E6%A0%B8%E5%BF%83%E7%AE%97%E6%B3%95%E4%BC%AA%E4%BB%A3%E7%A0%81_C_%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF\"><\/span>4 \u6838\u5fc3\u7b97\u6cd5\u4f2a\u4ee3\u7801 + C++ \u5b9e\u73b0\u601d\u8def<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"41_1_1_%E6%AF%94%E5%AF%B9%E5%87%BD%E6%95%B0\"><\/span>4.1 1:1 \u6bd4\u5bf9\u51fd\u6570<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u8f93\u5165\uff1a\u5b9e\u65f6\u91c7\u96c6\u6a21\u677fquery_tpl\uff0c\u5e93\u4e2d\u6ce8\u518c\u6a21\u677fdb_tpl\n\/\/ \u8fd4\u56de\uff1a\u5339\u914d\u5206\u6570 0~100\nfloat FingerMatch(const FpTemplate&amp; query_tpl, const FpTemplate&amp; db_tpl)\n{\n    \/\/ Step1\uff1a\u751f\u6210\u5019\u9009\u65cb\u8f6c+\u5e73\u79fb\u53d8\u6362\n    auto transform_list = EstimateTransform(query_tpl.minutiae, db_tpl.minutiae);\n\n    int max_matched = 0;\n    \/\/ Step2\uff1a\u904d\u5386\u5019\u9009\u53d8\u6362\uff0c\u5bf9\u9f50\u7ec6\u8282\u70b9\n    for(auto&amp; trans : transform_list)\n    {\n        auto aligned_points = ApplyTransform(db_tpl.minutiae, trans);\n        int match_cnt = 0;\n        std::vector&lt;bool&gt; used_q(query_tpl.minutiae.size(), false);\n        std::vector&lt;bool&gt; used_a(aligned_points.size(), false);\n\n        for(int i=0; i&lt;query_tpl.minutiae.size(); i++)\n        {\n            if(used_q&#091;i]) continue;\n            for(int j=0; j&lt;aligned_points.size(); j++)\n            {\n                if(used_a&#091;j]) continue;\n                double dist = EuclidDist(query_tpl.minutiae&#091;i], aligned_points&#091;j]);\n                double angle_diff = AngleDiff(query_tpl.minutiae&#091;i].angle, aligned_points&#091;j].angle);\n                if(dist &lt; D_THRESHOLD &amp;&amp; angle_diff &lt; A_THRESHOLD)\n                {\n                    match_cnt++;\n                    used_q&#091;i] = true;\n                    used_a&#091;j] = true;\n                    break;\n                }\n            }\n        }\n        if(match_cnt &gt; max_matched)\n            max_matched = match_cnt;\n    }\n    \/\/ \u8ba1\u7b97\u76f8\u4f3c\u5ea6\n    int total = std::max(query_tpl.minutiae.size(), db_tpl.minutiae.size());\n    float score = total == 0 ? 0.0f : (float)max_matched \/ total * 100.0f;\n    return score;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"42_1_N_%E6%A3%80%E7%B4%A2%EF%BC%88%E5%87%A0%E5%8D%83%E6%9D%A1%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88%EF%BC%89\"><\/span>4.2 1:N \u68c0\u7d22\uff08\u51e0\u5343\u6761\u4f18\u5316\u65b9\u6848\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u51e0\u5343\u6761\u89c4\u6a21\uff0c<strong>\u5168\u5e93\u904d\u5386\u5b8c\u5168\u53ef\u884c<\/strong>\uff1b\u53ef\u589e\u52a0\u6307\u7eb9\u5206\u7c7b\uff08\u6597 \/ \u7b95 \/ \u62f1\uff09\u4f5c\u4e3a\u524d\u7f6e\u8fc7\u6ee4\uff0c\u51cf\u5c11\u6bd4\u5bf9\u6b21\u6570\u3002<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 1:N\u68c0\u7d22\uff0c\u8f93\u5165\u91c7\u96c6\u6a21\u677f\uff0c\u8fd4\u56deTopN\u5019\u9009\u5217\u8868\nstd::vector&lt;std::pair&lt;std::string, float&gt;&gt; FingerSearch(const FpTemplate&amp; query,\n                                                         const std::vector&lt;FpTemplate&gt;&amp; cache_db)\n{\n    std::vector&lt;std::pair&lt;std::string, float&gt;&gt; result;\n    for(auto&amp; tpl : cache_db)\n    {\n        float sc = FingerMatch(query, tpl);\n        if(sc &gt;= MATCH_THRESHOLD)\n        {\n            result.emplace_back(tpl.person_id, sc);\n        }\n    }\n    \/\/ \u964d\u5e8f\u6392\u5e8f\n    std::sort(result.begin(), result.end(), &#091;](auto&amp; a, auto&amp; b){\n        return a.second &gt; b.second;\n    });\n    return result;\n}\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u4f18\u5316\uff1a\u7a0b\u5e8f\u542f\u52a8\u65f6\u4e00\u6b21\u6027\u628a\u5168\u90e8\u6307\u7eb9\u6a21\u677f\u52a0\u8f7d\u8fdb\u5185\u5b58 vector\uff0c<strong>\u907f\u514d\u6bcf\u6b21\u68c0\u7d22\u67e5\u5e93<\/strong>\uff1b\u6a21\u677f\u53d8\u66f4\u65f6\u589e\u91cf\u5237\u65b0\u5185\u5b58\u7f13\u5b58\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E8%81%94%E5%8A%A8%E6%B5%81%E7%A8%8B%EF%BC%882_%E7%A7%8D%E4%B8%9A%E5%8A%A1%E6%A8%A1%E5%BC%8F%EF%BC%89\"><\/span>5 \u6570\u5b57\u8eab\u4efd\u8054\u52a8\u6d41\u7a0b\uff082 \u79cd\u4e1a\u52a1\u6a21\u5f0f\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A8%A1%E5%BC%8F_A%EF%BC%9A%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E5%85%88%E8%A1%8C%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%8CMFA_%E5%8F%8C%E5%9B%A0%E5%AD%90%E8%AE%A4%E8%AF%81%EF%BC%89\"><\/span>\u6a21\u5f0f A\uff1a\u6570\u5b57\u8eab\u4efd\u5148\u884c\uff08\u63a8\u8350\uff0cMFA \u53cc\u56e0\u5b50\u8ba4\u8bc1\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u7528\u6237\u8f93\u5165\u6570\u5b57\u8eab\u4efd\u51ed\u8bc1\uff08\u8d26\u53f7 \/ \u8bc1\u4e66\uff09\uff0c\u7cfb\u7edf\u8c03\u7528 LDAP \/ \u6570\u5b57\u8eab\u4efd\u670d\u52a1\uff0c\u6821\u9a8c\u8d26\u53f7\u5408\u6cd5\u6027\uff0c\u62ff\u5230<code>person_id<\/code>\uff1b<\/li>\n\n\n\n<li>\u4e0b\u53d1\u6307\u4ee4\uff0c\u6307\u7eb9\u5934\u91c7\u96c6\u6307\u7eb9\uff1b<\/li>\n\n\n\n<li>C++ \u5f15\u64ce\u63d0\u53d6\u5b9e\u65f6\u6307\u7eb9\u6a21\u677f\uff1b<\/li>\n\n\n\n<li>1:1 \u6bd4\u5bf9\uff0c\u62ff\u8be5 person_id \u5bf9\u5e94\u7684\u6307\u7eb9\u6a21\u677f\u505a\u6838\u9a8c\uff1b<\/li>\n\n\n\n<li>\u6307\u7eb9\u5339\u914d\u6210\u529f \u2192 \u53cc\u56e0\u5b50\u8ba4\u8bc1\u901a\u8fc7\uff1b\u5426\u5219\u62d2\u7edd\uff1b<\/li>\n\n\n\n<li>\u5199\u5165\u5ba1\u8ba1\u65e5\u5fd7\uff0c\u8fd4\u56de\u8ba4\u8bc1\u7ed3\u679c\u7ed9\u6570\u5b57\u8eab\u4efd\u7cfb\u7edf\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A8%A1%E5%BC%8F_B%EF%BC%9A%E6%8C%87%E7%BA%B9%E5%85%88%E8%A1%8C%E6%A3%80%E7%B4%A2\"><\/span>\u6a21\u5f0f B\uff1a\u6307\u7eb9\u5148\u884c\u68c0\u7d22<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u91c7\u96c6\u6307\u7eb9\uff0c\u63d0\u53d6\u6a21\u677f\uff1b<\/li>\n\n\n\n<li>1:N \u5185\u5b58\u68c0\u7d22\uff0c\u5f97\u5230\u5019\u9009<code>person_id<\/code>\uff1b<\/li>\n\n\n\n<li>\u4f7f\u7528 person_id \u53bb\u6570\u5b57\u8eab\u4efd\u7cfb\u7edf\u67e5\u8be2\u8be5\u8d26\u53f7\u72b6\u6001\uff08\u662f\u5426\u542f\u7528\u3001\u6743\u9650\uff09\uff1b<\/li>\n\n\n\n<li>\u8fd4\u56de\u8eab\u4efd\u4fe1\u606f\u7ed9\u4e1a\u52a1\u3002<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u6307\u7eb9\u53ea\u505a\u8eab\u4efd\u6838\u9a8c\uff0c<strong>\u4e0d\u66ff\u4ee3\u6570\u5b57\u8eab\u4efd\u4e3b\u4f53<\/strong>\uff0c\u6743\u9650\u63a7\u5236\u4ecd\u7531\u6570\u5b57\u8eab\u4efd\u7cfb\u7edf\u7ba1\u7406\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%EF%BC%88Linux%EF%BC%8C%E6%8E%A8%E8%8D%90_SQLite_%E6%88%96_MySQL%EF%BC%89\"><\/span>6 \u6570\u636e\u5e93\u8bbe\u8ba1\uff08Linux\uff0c\u63a8\u8350 SQLite \u6216 MySQL\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u51e0\u5343\u91cf\u7ea7\uff0cSQLite \u8db3\u591f\u5355\u673a\u79bb\u7ebf\u4f7f\u7528\uff1b\u5982\u679c\u540e\u7eed\u8981\u591a\u670d\u52a1\u8bbf\u95ee\uff0c\u4f7f\u7528 MySQL\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6570\u636e\u5e93\u53ea\u5b58\u6a21\u677f\u4e8c\u8fdb\u5236\uff0c<strong>\u7981\u6b62\u5b58\u50a8\u6307\u7eb9\u539f\u56fe<\/strong>\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"person_%E4%BA%BA%E5%91%98%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%E6%98%A0%E5%B0%84%E8%A1%A8\"><\/span>person \u4eba\u5458\u6570\u5b57\u8eab\u4efd\u6620\u5c04\u8868<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8868\u683c<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u6bb5<\/th><th>\u7c7b\u578b<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>person_id<\/td><td>varchar(64)<\/td><td>\u4e3b\u952e\uff0c<strong>\u6570\u5b57\u8eab\u4efd\u552f\u4e00\u6807\u8bc6 DN\/UUID<\/strong><\/td><\/tr><tr><td>name<\/td><td>varchar<\/td><td>\u59d3\u540d<\/td><\/tr><tr><td>id_status<\/td><td>tinyint<\/td><td>\u8d26\u53f7\u72b6\u6001\uff1a\u542f\u7528 \/ \u7981\u7528<\/td><\/tr><tr><td>ldap_dn<\/td><td>varchar<\/td><td>OpenLDAP DN\uff08\u5bf9\u63a5\u6570\u5b57\u8eab\u4efd\uff09<\/td><\/tr><tr><td>create_at<\/td><td>datetime<\/td><td>\u521b\u5efa\u65f6\u95f4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"fp_template_%E6%8C%87%E7%BA%B9%E6%A8%A1%E6%9D%BF%E8%A1%A8\"><\/span>fp_template \u6307\u7eb9\u6a21\u677f\u8868<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8868\u683c<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u6bb5<\/th><th>\u7c7b\u578b<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>template_id<\/td><td>varchar(64)<\/td><td>\u4e3b\u952e\uff0c\u6a21\u677f UUID<\/td><\/tr><tr><td>person_id<\/td><td>varchar(64)<\/td><td>\u5916\u952e\uff0c\u5173\u8054\u6570\u5b57\u8eab\u4efd ID<\/td><\/tr><tr><td>template_bin<\/td><td>BLOB<\/td><td>Protobuf \u5e8f\u5217\u5316\u6307\u7eb9\u6a21\u677f<\/td><\/tr><tr><td>quality_score<\/td><td>int<\/td><td>\u6ce8\u518c\u8d28\u91cf\u5206<\/td><\/tr><tr><td>register_ts<\/td><td>uint64_t<\/td><td>\u6ce8\u518c\u65f6\u95f4\u6233<\/td><\/tr><tr><td>device_sn<\/td><td>varchar<\/td><td>\u91c7\u96c6\u8bbe\u5907\u5e8f\u5217\u53f7<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"fp_audit_log_%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%E8%A1%A8\"><\/span>fp_audit_log \u5ba1\u8ba1\u65e5\u5fd7\u8868<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8868\u683c<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u6bb5<\/th><th>\u7c7b\u578b<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>log_id<\/td><td>bigint<\/td><td>\u81ea\u589e\u4e3b\u952e<\/td><\/tr><tr><td>person_id<\/td><td>varchar<\/td><td>\u4eba\u5458 ID<\/td><\/tr><tr><td>auth_mode<\/td><td>enum<\/td><td>1:1 \/ 1:N<\/td><\/tr><tr><td>score<\/td><td>float<\/td><td>\u6bd4\u5bf9\u5206\u6570<\/td><\/tr><tr><td>result<\/td><td>tinyint<\/td><td>1 \u5339\u914d 0 \u4e0d\u5339\u914d<\/td><\/tr><tr><td>device_sn<\/td><td>varchar<\/td><td>\u8bbe\u5907\u7f16\u53f7<\/td><\/tr><tr><td>operate_ts<\/td><td>uint64_t<\/td><td>\u64cd\u4f5c\u65f6\u95f4\u6233<\/td><\/tr><tr><td>auth_source<\/td><td>varchar<\/td><td>\u6570\u5b57\u8eab\u4efd\u6765\u6e90\uff08LDAP\/local\uff09<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_C_%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84%EF%BC%88Linux%EF%BC%89\"><\/span>7 C++ \u5de5\u7a0b\u7ed3\u6784\uff08Linux\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>fp-auth-service\/\n\u251c\u2500\u2500 CMakeLists.txt          # CMake\u6784\u5efa\u811a\u672c\n\u251c\u2500\u2500 src\/\n\u2502   \u251c\u2500\u2500 fingerprint\/        # \u6307\u7eb9\u5f15\u64ce\u5e93 libfingerprint.so\n\u2502   \u2502   \u251c\u2500\u2500 fp_preprocess.cpp\n\u2502   \u2502   \u251c\u2500\u2500 fp_minutiae.cpp\n\u2502   \u2502   \u251c\u2500\u2500 fp_match.cpp\n\u2502   \u2502   \u2514\u2500\u2500 fp_template.cpp\n\u2502   \u251c\u2500\u2500 identity\/           # \u6570\u5b57\u8eab\u4efd\u5bf9\u63a5\u6a21\u5757\n\u2502   \u2502   \u251c\u2500\u2500 ldap_client.cpp # LDAP\u5ba2\u6237\u7aef\uff08\u5bf9\u63a5\u6570\u5b57\u8eab\u4efd\uff09\n\u2502   \u2502   \u2514\u2500\u2500 identity_mfa.cpp# MFA\u8ba4\u8bc1\u7f16\u6392\u903b\u8f91\n\u2502   \u251c\u2500\u2500 service\/            # \u4e3b\u670d\u52a1\n\u2502   \u2502   \u251c\u2500\u2500 fp_api.cpp\n\u2502   \u2502   \u251c\u2500\u2500 template_cache.cpp # \u5185\u5b58\u6a21\u677f\u7f13\u5b58\n\u2502   \u2502   \u2514\u2500\u2500 main.cpp\n\u2502   \u2514\u2500\u2500 db\/                 # \u6570\u636e\u5e93\u5c01\u88c5\uff08sqlite\/mysql\uff09\n\u251c\u2500\u2500 proto\/                  # Protobuf\u6a21\u677f\u5b9a\u4e49\n\u251c\u2500\u2500 include\/                # \u5934\u6587\u4ef6\n\u251c\u2500\u2500 tests\/                  # \u5355\u5143\u6d4b\u8bd5\n\u251c\u2500\u2500 config\/\n\u2502   \u2514\u2500\u2500 fp_config.ini       # \u9608\u503c\u3001\u53c2\u6570\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 logs\/\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7f16\u8bd1\u90e8\u7f72<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6784\u5efa\u5de5\u5177\uff1aCMake + GCC<\/li>\n\n\n\n<li>\u4f9d\u8d56\uff1aopencv\uff08\u56fe\u50cf\u9884\u5904\u7406\uff09\u3001protobuf\u3001sqlite3\u3001openldap\uff08\u53ef\u9009\uff09<\/li>\n\n\n\n<li>\u7f16\u8bd1\u4ea7\u7269\uff1a<code>libfingerprint.so<\/code> + <code>fp-auth-service<\/code> \u53ef\u6267\u884c\u7a0b\u5e8f<\/li>\n\n\n\n<li>\u8fd0\u884c\uff1aLinux systemd \u6258\u7ba1\u670d\u52a1\uff0c\u540e\u53f0\u5e38\u9a7b<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1%EF%BC%88%E4%B8%A4%E7%A7%8D%E5%8F%AF%E9%80%89%EF%BC%89\"><\/span>8 \u63a5\u53e3\u8bbe\u8ba1\uff08\u4e24\u79cd\u53ef\u9009\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%A1%88_1%EF%BC%9A%E6%9C%AC%E5%9C%B0_IPC%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%8C%E5%86%85%E7%BD%91_%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1%EF%BC%8C%E8%BD%BB%E9%87%8F%EF%BC%89\"><\/span>\u65b9\u6848 1\uff1a\u672c\u5730 IPC\uff08\u63a8\u8350\uff0c\u5185\u7f51 \/ \u672c\u5730\u670d\u52a1\uff0c\u8f7b\u91cf\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528 unix domain socket\uff0cC++ \u672c\u5730\u8fdb\u7a0b\u901a\u4fe1\uff0c\u4f9b\u4e0a\u5c42\u6570\u5b57\u8eab\u4efd\u670d\u52a1\u8c03\u7528\u3002 \u6307\u4ee4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>REGISTER<\/code>\uff1a\u91c7\u96c6\u6307\u7eb9\u751f\u6210\u6a21\u677f\uff0c\u7ed1\u5b9a person_id<\/li>\n\n\n\n<li><code>VERIFY_11<\/code>\uff1a\u4f20\u5165 person_id + \u6307\u7eb9\u56fe\u50cf\uff0c1:1 \u6838\u9a8c<\/li>\n\n\n\n<li><code>SEARCH_1N<\/code>\uff1a\u4f20\u5165\u6307\u7eb9\u56fe\u50cf\uff0c\u8fd4\u56de\u5019\u9009 person_id \u5217\u8868<\/li>\n\n\n\n<li><code>TEMPLATE_DEL<\/code>\uff1a\u5220\u9664\u6307\u7eb9\u6a21\u677f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%96%B9%E6%A1%88_2%EF%BC%9AHTTP%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%8C%E8%B7%A8%E4%B8%BB%E6%9C%BA%E8%B0%83%E7%94%A8%EF%BC%89\"><\/span>\u65b9\u6848 2\uff1aHTTP\uff08\u53ef\u9009\uff0c\u8de8\u4e3b\u673a\u8c03\u7528\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5d4c\u5165\u8f7b\u91cf http \u5e93\u5982 mongoose\uff0c\u63d0\u4f9b REST \u63a5\u53e3\uff0cTLS \u52a0\u5bc6\u4f20\u8f93\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>POST \/fp\/register<\/li>\n\n\n\n<li>POST \/fp\/verify11<\/li>\n\n\n\n<li>POST \/fp\/search1n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9_%E5%AE%89%E5%85%A8%E8%AE%BE%E8%AE%A1%EF%BC%88%E7%BB%93%E5%90%88%E6%95%B0%E5%AD%97%E8%BA%AB%E4%BB%BD%EF%BC%89\"><\/span>9 \u5b89\u5168\u8bbe\u8ba1\uff08\u7ed3\u5408\u6570\u5b57\u8eab\u4efd\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u751f\u7269\u4fe1\u606f\u4fdd\u62a4<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u56fe\u50cf\u5185\u5b58\u91c7\u96c6\uff0c\u6a21\u677f\u63d0\u53d6\u5b8c\u6210\u540e\u539f\u56fe\u5185\u5b58\u7acb\u5373\u91ca\u653e\uff0c\u4e0d\u5199\u76d8\uff1b<\/li>\n\n\n\n<li>\u6a21\u677f\u53ef\u505a\u52a0\u76d0\u6df7\u6dc6\uff0c\u6a21\u677f\u4e0d\u53ef\u9006\u8fd8\u539f\u6307\u7eb9\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6570\u5b57\u8eab\u4efd\u5b89\u5168\u8fb9\u754c<\/strong>\n<ul class=\"wp-block-list\">\n<li>LDAP \u8fde\u63a5\u4f7f\u7528 LDAPS 636 \u52a0\u5bc6\uff1b<\/li>\n\n\n\n<li>\u6307\u7eb9\u6a21\u5757\u672c\u8eab<strong>\u4e0d\u7ba1\u7406\u6743\u9650<\/strong>\uff0c\u6743\u9650\u7531\u6570\u5b57\u8eab\u4efd\u7cfb\u7edf\u7edf\u4e00\u7ba1\u63a7\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u8bbf\u95ee\u63a7\u5236<\/strong>\n<ul class=\"wp-block-list\">\n<li>fp-auth-service \u8fdb\u7a0b\u6700\u5c0f\u6743\u9650\u8fd0\u884c\uff0c\u7981\u6b62 root\uff1b<\/li>\n\n\n\n<li>\u6a21\u677f\u6570\u636e\u5e93\u6587\u4ef6\u6743\u9650 <code>0600<\/code>\uff0c\u4ec5\u670d\u52a1\u8fdb\u7a0b\u53ef\u8bfb\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u9632\u66b4\u529b\u68c0\u7d22<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u63a5\u53e3\u9650\u6d41\uff0c1:N \u68c0\u7d22\u9891\u7387\u9650\u5236\uff1b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6269\u5c55\uff1a\u53ef\u63a5\u5165\u6d3b\u4f53\u68c0\u6d4b\uff0c\u62b5\u5fa1\u5047\u6307\u7eb9\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"10_%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%A4%BA%E4%BE%8B_fp_configini\"><\/span>10 \u914d\u7f6e\u6587\u4ef6\u793a\u4f8b fp_config.ini<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;fingerprint]\nD_THRESHOLD = 5.0\nA_THRESHOLD = 15.0\nMATCH_THRESHOLD = 65.0<\/code><\/pre>\n\n\n<p>[cache]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">enable_cache = true preload_all_template = true<\/p>\n\n\n<p>[identity]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">identity_type = ldap ldap_uri = ldaps:\/\/127.0.0.1:636 base_dn = ou=user,dc=example,dc=com<\/p>\n\n\n<p>[log]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">log_level = info log_path = .\/logs<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_%E6%B5%8B%E8%AF%95%E6%96%B9%E6%A1%88\"><\/span>11 \u6d4b\u8bd5\u65b9\u6848<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5355\u5143\u6d4b\u8bd5\uff1a\u5355\u72ec\u6d4b\u8bd5\u9884\u5904\u7406\u3001\u7ec6\u8282\u70b9\u63d0\u53d6\u3001\u6bd4\u5bf9\u51fd\u6570\uff1b<\/li>\n\n\n\n<li>\u6027\u80fd\u6d4b\u8bd5\uff1a1:N \u904d\u5386 1000\u30015000\u300110000 \u6a21\u677f\uff0c\u7edf\u8ba1\u8017\u65f6\uff1b<\/li>\n\n\n\n<li>FRR\/FAR \u6d4b\u8bd5\uff1a\u6536\u96c6\u591a\u7ec4\u6307\u7eb9\u6837\u672c\uff0c\u8c03\u5339\u914d\u9608\u503c\uff1b<\/li>\n\n\n\n<li>\u96c6\u6210\u6d4b\u8bd5\uff1a\u5b8c\u6574\u94fe\u8def\u300cLDAP \u6570\u5b57\u8eab\u4efd\u9274\u6743 + \u6307\u7eb9 MFA\u300d\u8054\u8c03\uff1b<\/li>\n\n\n\n<li>\u7a33\u5b9a\u6027\uff1a\u957f\u65f6\u95f4\u8fde\u7eed\u91c7\u96c6\u6bd4\u5bf9\uff0c\u5185\u5b58\u6cc4\u6f0f\u68c0\u6d4b\uff08valgrind\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_%E6%89%A9%E5%B1%95%E4%B8%8E%E9%A3%8E%E9%99%A9\"><\/span>12 \u6269\u5c55\u4e0e\u98ce\u9669<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6307\u7eb9\u78e8\u635f\u3001\u8131\u76ae\uff1a\u652f\u6301\u4e00\u4e2a person_id \u7ed1\u5b9a<strong>\u591a\u679a\u6307\u7eb9\u6a21\u677f<\/strong>\uff08\u540c\u4e00\u624b\u6307\u591a\u6b21\u91c7\u96c6\uff09\uff0c\u964d\u4f4e FRR\uff1b<\/li>\n\n\n\n<li>\u6a21\u677f\u6269\u5bb9\uff1a\u8d85\u8fc7 1 \u4e07\u6761\u540e\uff0c\u53ef\u589e\u52a0\u5411\u91cf\u68c0\u7d22 \/ \u6307\u7eb9\u5206\u7c7b\u9884\u8fc7\u6ee4\uff1b<\/li>\n\n\n\n<li>\u9ad8\u53ef\u7528\uff1a\u591a\u5b9e\u4f8b\u90e8\u7f72\u65f6\uff0c\u6a21\u677f\u5e93\u7edf\u4e00\u6301\u4e45\u5316\uff0c\u5185\u5b58\u7f13\u5b58\u5404\u81ea\u52a0\u8f7d\uff1b<\/li>\n\n\n\n<li>\u98ce\u9669\uff1a\u6307\u7eb9\u5c5e\u4e8e\u751f\u7269\u7279\u5f81\uff0c<strong>\u6a21\u677f\u6cc4\u9732\u4e0d\u53ef\u9006<\/strong>\uff0c\u6570\u636e\u5e93\u5fc5\u987b\u5f3a\u8bbf\u95ee\u63a7\u5236\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"13_%E4%BA%A4%E4%BB%98%E7%89%A9%E6%B8%85%E5%8D%95\"><\/span>13 \u4ea4\u4ed8\u7269\u6e05\u5355<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5b8c\u6574 Markdown \u65b9\u6848\u6587\u6863\uff08\u5f53\u524d\uff09<\/li>\n\n\n\n<li>CMake \u5de5\u7a0b\u76ee\u5f55\u7ed3\u6784<\/li>\n\n\n\n<li>Protobuf \u6a21\u677f\u5b9a\u4e49\u6587\u4ef6<\/li>\n\n\n\n<li>\u6570\u636e\u5e93\u5efa\u8868 SQL\uff08SQLite+MySQL\uff09<\/li>\n\n\n\n<li>\u6838\u5fc3\u6a21\u5757 C++ \u4ee3\u7801\u6846\u67b6<\/li>\n\n\n\n<li>systemd \u670d\u52a1\u914d\u7f6e\u6587\u4ef6<\/li>\n\n\n\n<li>\u6d4b\u8bd5\u7528\u4f8b<\/li>\n<\/ol>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>\u6307\u7eb9\u6bd4\u5bf9\u7cfb\u7edf\u8bbe\u8ba1\u65b9\u6848\uff08\u4fee\u8ba2\u7248 v1.01\uff09 \u8fd0\u884c\u73af &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gfmr_meta_descriptions":[],"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_gfmr_multilingual_taxonomy_terms":[],"_gfmr_toc_enabled":"inherit","_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[28],"tags":[],"class_list":["post-3300","post","type-post","status-publish","format-standard","hentry","category-28"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/posts\/3300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/comments?post=3300"}],"version-history":[{"count":1,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/posts\/3300\/revisions"}],"predecessor-version":[{"id":3301,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/posts\/3300\/revisions\/3301"}],"wp:attachment":[{"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/media?parent=3300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/categories?post=3300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/randengzhe.cn\/wordpress\/wp-json\/wp\/v2\/tags?post=3300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}