C++ - 仿 RabbitMQ 實現消息隊列--sqlite與gtest快速上手

目錄

SQLite

什么是 SQLite

為什么要用 SQLite

SQLite3 C/C++ API 介紹

SQLite3 C/C++ API 使用

GTest

GTest 是什么

GTest 使用

TEST 宏

斷言

事件機制

全局事件

TestSuite 事件


SQLite

什么是 SQLite

????????SQLite 是一個進程內的輕量級數據庫,它實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。它是一個零配置的數據庫,這意味著與其他數據庫不一樣,我們不需要在系統中配置。像其他數據庫,SQLite 引擎不是一個獨立的進程,可以按應用程序需求進行靜態或動態連接,SQLite 直接訪問其存儲文件。

為什么要用 SQLite

  • 不需要一個單獨的服務器進程或操作的系統(無服務器的)。
  • SQLite 不需要配置。
  • 一個完整的 SQLite 數據庫是存儲在一個單一的跨平臺的磁盤文件。
  • SQLite 是非常小的,是輕量級的,完全配置時小于 400KiB,省略可選功能配置時小于250KiB。
  • SQLite 是自給自足的,這意味著不需要任何外部的依賴。
  • SQLite 事務是完全兼容 ACID 的,允許從多個進程或線程安全訪問。
  • SQLite 支持 SQL92(SQL2)標準的大多數查詢語言的功能。
  • SQLite 使用 ANSI-C 編寫的,并提供了簡單和易于使用的 API。
  • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32,?WinCE, WinRT)中運行。

SQLite3 C/C++ API 介紹

????????C/C++ API 是 SQLite3 數據庫的一個客戶端, 提供一種用 C/C++操作數據庫的方法。下面我們介紹一下常見的幾個接口:

sqlite3 操作流程:
0. 查看當前數據庫在編譯階段是否啟動了線程安全
?????????int sqlite3_threadsafe(); 0-未啟用; 1-啟用
?????????需要注意的是 sqlite3 是有三種安全等級的:

  1. 非線程安全模式
  2. 線程安全模式(不同的連接在不同的線程/進程間是安全的,即一個句柄不能用于多線程間)
  3. ?串行化模式(可以在不同的線程/進程間使用同一個句柄)

1. 創建/打開數據庫文件,并返回操作句柄
?????????int sqlite3_open(const char *filename, sqlite3 **ppDb) 成功返回SQLITE_OK
?//若在編譯階段啟動了線程安全,則在程序運行階段可以通過參數選擇線程安全等級
?????????int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );

flag:?

  1. ?SQLITE_OPEN_READWRITE -- 以可讀可寫方式打開數據庫文件
  2. ?SQLITE_OPEN_CREATE -- 不存在數據庫文件則創建
  3. ?SQLITE_OPEN_NOMUTEX--多線程模式,只要不同的線程使用不同的連接即可保證線程安全
  4. ?SQLITE_OPEN_FULLMUTEX--串行化模式

?返回:SQLITE_OK 表示成功
2. 執行語句
?????????int sqlite3_exec(sqlite3*, char *sql, int?(*callback)(void*,int,char**,char**), ?void* arg, char **err)???返回:SQLITE_OK 表示成功

  1. sqlite3*:數據庫文件句柄。
  2. char *sql:sql語句。
  3. int?(*callback)(void*,int,char**,char**):對執行結果的回調函數。
  4. void* arg:給回調函數的第一個參數,常用于保存處理結果。
  5. char **err:錯誤信息。

????????int (*callback)(void*,int,char**,char**)

  1. ?void* : 是設置的在回調時傳入的 arg 參數。
  2. ?int:一行中數據的列數。
  3. ?char**:存儲一行數據的字符指針數組。
  4. ?char**:每一列的字段名稱。

? ? ? ? ?對于每一行結果都會執行這個回調函數,這個回調函數有個 int 返回值,成功處理的情況下必須返回 0,返回非 0會觸發 ABORT 退出程序
3. 銷毀句柄
?????????int sqlite3_close(sqlite3* db); 成功返回 SQLITE_OK
?????????int sqlite3_close_v2(sqlite3*); 推薦使用--無論如何都會返回SQLITE_OK
????????獲取錯誤信息
?????????const char *sqlite3_errmsg(sqlite3* db);

SQLite3 C/C++ API 使用

????????下面我們將這幾個接口封裝成一個類,快速上手這幾個接口

// 封裝一個sqlitehelper類
#pragma once#include <sqlite3.h>
#include <iostream>
#include <string>class SqliteHelper
{
public:typedef int (*sqliteCallback)(void*, int, char**, char**);SqliteHelper(const std::string &dbfile):_dbfile(dbfile), _handler(nullptr) {}bool open(int safe_level = SQLITE_OPEN_FULLMUTEX){int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level, nullptr);if (ret != SQLITE_OK){std::cerr << "打開/創建數據庫失敗: " << sqlite3_errmsg(_handler) << std::endl;return false;}return true;}bool exec(const std::string &sql, sqliteCallback callback, void *arg){int ret = sqlite3_exec(_handler, sql.c_str(), callback, arg, nullptr);if (ret != SQLITE_OK){std::cerr << sql << std::endl;std::cerr << "執行語句失敗: " << sqlite3_errmsg(_handler) << std::endl;return false;}return true;}void close(){if(_handler)sqlite3_close_v2(_handler);}
private:std::string _dbfile;sqlite3 *_handler;
};

測試程序:

#include "sqlite.hpp"
#include <cassert>
#include <vector>int select_stu_callback(void *arg, int col_count, char **result, char **fields_name)
{std::vector<std::string> *names = (std::vector<std::string>*)arg;names->push_back(result[0]);return 0;
}int main()
{SqliteHelper helper("./test.db");// 創建/打開庫文件assert(helper.open());// 創建表const char *ct = "create table if not exists student(sn int primary key, name varchar(32), age int);";assert(helper.exec(ct, nullptr, nullptr));// 新增數據const char *insert_sql = "insert into student values(1, '小明', 18), (2, '小剛', 19), (3, '小紅', 18);";assert(helper.exec(insert_sql, nullptr, nullptr));const char *select_sql = "select name from student;";std::vector<std::string> names;assert(helper.exec(select_sql, select_stu_callback, &names));for (auto &name : names){std::cout << name << std::endl;}// 關閉數據庫helper.close();return 0;
}

GTest

GTest 是什么

????????GTest 是一個跨平臺的 C++單元測試框架,由 google 公司發布。gtest 是為了在不同平臺上為編寫 C++單元測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化等等。

GTest 使用

TEST 宏

TEST(test_case_name, test_name)
TEST_F(test_fixture,test_name)
  • TEST:主要用來創建一個簡單測試, 它定義了一個測試函數, 在這個函數中可以使用任何 C++代碼并且使用框架提供的斷言進行檢查。
  • TEST_F:主要用來進行多樣測試,適用于多個測試場景如果需要相同的數據配置的情況, 即相同的數據測不同的行為。

斷言

GTest 中的斷言的宏可以分為兩類:

  1. ASSERT_系列:如果當前點檢測失敗則退出當前函數。
  2. EXPECT_系列:如果當前點檢測失敗則繼續往下執行。

下面是經常使用的斷言介紹:

// bool 值檢查
ASSERT_TRUE(參數),期待結果是 true
ASSERT_FALSE(參數),期待結果是 false
//數值型數據檢查
ASSERT_EQ(參數 1,參數 2),傳入的是需要比較的兩個數 equal
ASSERT_NE(參數 1,參數 2),not equal,不等于才返回 true
ASSERT_LT(參數 1,參數 2),less than,小于才返回 true
ASSERT_GT(參數 1,參數 2),greater than,大于才返回 true
ASSERT_LE(參數 1,參數 2),less equal,小于等于才返回 true
ASSERT_GE(參數 1,參數 2),greater equal,大于等于才返回 true

下面我們做一個測試:

#include <iostream>
#include <gtest/gtest.h>// 斷言宏的使用 ASSERT_ 斷言失敗則退出   EXPECT_斷言失敗繼續運行   必須在單元測試宏函數中使用TEST(test, great_than)
{int age = 20;ASSERT_GT(age, 18);printf("OK\n");
}int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();    
}

運行結果:

[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from test
[ RUN      ] test.great_than
OK
[       OK ] test.great_than (0 ms)
[----------] 1 test from test (0 ms total)[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

事件機制

????????GTest 中的事件機制是指在測試前和測試后提供給用戶自行添加操作的機制,而且該機制也可以讓同一測試套件下的測試用例共享數據。GTest 框架中事件的結構層次:

  1. ?測試程序:一個測試程序只有一個 main 函數,也可以說是一個可執行程序是一個測試程序。該級別的事件機制是在程序的開始和結束執行。
  2. 測試套件:代表一個測試用例的集合體,該級別的事件機制是在整體的測試案例開始和結束執行。
  3. 測試用例:該級別的事件機制是在每個測試用例開始和結束都執行。

????????事件機制的最大好處就是能夠為我們各個測試用例提前準備好測試環境,并在測試完畢后用于銷毀環境,這樣有個好處就是如果我們有一端代碼需要進行多種不同方法的測試,則可以通過測試機制在每個測試用例進行之前初始化測試環境和數據,并在測試完畢后清理測試造成的影響。

?GTest 提供了三種常見的的事件:

全局事件

????????針對整個測試程序。實現全局的事件機制,需要創建一個自己的類,然后繼承 testing::Environment 類,然后分別實現成員函數 SetUp 和 TearDown,同時在 main 函數內進行調用 testing::AddGlobalTestEnvironment(new?MyEnvironment);函數添加全局的事件機制。

#include <iostream>
#include <gtest/gtest.h>
#include <unordered_map>
#include <string>class MyEnvironment : public testing::Environment
{
public:virtual void SetUp() override{std::cout << "單元測試環境初始化" << std::endl;}virtual void TearDown() override{std::cout << "單元測試環境清理" << std::endl;}
};TEST(MyEnvironment, test1)
{std::cout << "單元測試1" << std::endl;
}TEST(MyEnvironment, test2)
{std::cout << "單元測試2" << std::endl;
}std::unordered_map<std::string, std::string> mymap;
class MyMapTest : public testing::Environment
{
public:virtual void SetUp() override{std::cout << "單元測試環境初始化" << std::endl;mymap.insert(std::make_pair("hello", "你好"));mymap.insert(std::make_pair("bye", "再見"));}virtual void TearDown() override{std::cout << "單元測試環境清理" << std::endl;mymap.clear();}
};TEST(MyMapTest, test1)
{ASSERT_EQ(mymap.size(), 2);mymap.erase("hello");
}TEST(MyMapTest, test2)
{ASSERT_EQ(mymap.size(), 2);
}int main(int argc, char *argv[])
{testing::AddGlobalTestEnvironment(new MyEnvironment);testing::AddGlobalTestEnvironment(new MyMapTest);testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

運行結果:

[==========] Running 4 tests from 2 test suites.
[----------] Global test environment set-up.
單元測試環境初始化
單元測試環境初始化
[----------] 2 tests from MyEnvironment
[ RUN      ] MyEnvironment.test1
單元測試1
[       OK ] MyEnvironment.test1 (0 ms)
[ RUN      ] MyEnvironment.test2
單元測試2
[       OK ] MyEnvironment.test2 (0 ms)
[----------] 2 tests from MyEnvironment (0 ms total)[----------] 2 tests from MyMapTest
[ RUN      ] MyMapTest.test1
[       OK ] MyMapTest.test1 (0 ms)
[ RUN      ] MyMapTest.test2
global.cc:58: Failure
Expected equality of these values:mymap.size()Which is: 12
[  FAILED  ] MyMapTest.test2 (0 ms)
[----------] 2 tests from MyMapTest (0 ms total)[----------] Global test environment tear-down
單元測試環境清理
單元測試環境清理
[==========] 4 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 3 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] MyMapTest.test21 FAILED TEST
TestSuite 事件

????????針對一個個測試套件。測試套件的事件機制我們同樣需要去創建一個類,繼承自testing::Test,實現兩個靜態函數 SetUpTestCase 和TearDownTestCase,測試套件的事件機制不需要像全局事件機制一樣在 main 注冊,而是需要將我們平時使用的 TEST 宏改為 TEST_F 宏。

  • ?SetUpTestCase() 函數是在測試套件第一個測試用例開始前執行。
  • TearDownTestCase() 函數是在測試套件最后一個測試用例結束后執行。
  • 需要注意 TEST_F 的第一個參數是我們創建的類名,也就是當前測試套件的名稱,這樣在 TEST_F 宏的測試套件中就可以訪問類中的成員了。
#include <iostream>
#include <gtest/gtest.h>
#include <unordered_map>
#include <string>class MyTest : public testing::Test
{
public:static void SetUpTestCase(){std::cout << "所有單元測試前初始化環境\n";}static void TearDownTestCase(){std::cout << "所有單元測試完畢后清理環境\n";}std::unordered_map<std::string, std::string> _mymap;
};TEST_F(MyTest, insert_test)
{_mymap.insert(std::make_pair("good", "好"));
}TEST_F(MyTest, size_test)
{ASSERT_EQ(_mymap.size(), 1);
}int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

?運行結果:

[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from MyTest
所有單元測試前初始化環境
[ RUN      ] MyTest.insert_test
[       OK ] MyTest.insert_test (0 ms)
[ RUN      ] MyTest.size_test
suit.cc:40: Failure
Expected equality of these values:_mymap.size()Which is: 01
[  FAILED  ] MyTest.size_test (0 ms)
所有單元測試完畢后清理環境
[----------] 2 tests from MyTest (0 ms total)[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] MyTest.size_test1 FAILED TEST

????????能夠看到在上例中,有一個好處,就是將數據與測試結合到同一個測試環境類中了,這樣與外界的耦合度更低,代碼也更清晰。
????????但是同樣的,我們發現在兩個測試用例中第二個測試用例失敗了,這是為什么呢?這就涉及到了 TestCase 事件的機制。
????????? TestCase 事件:?針對一個個測試用例。測試用例的事件機制的創建和測試套件的基本一樣,不同地方在于測試用例實現的兩個函數分別是 SetUp 和 TearDown, 這兩個函數也不是靜態函數

????????○ SetUp()函數是在一個測試用例的開始前執行

????????○ TearDown()函數是在一個測試用例的結束后執行
????????也就是說,在 TestSuite/TestCase 事件中,每個測試用例,雖然它們同用同一個事件環境類,可以訪問其中的資源,但是本質上每個測試用例的環境都是獨立的,這樣我們就不用擔心不同的測試用例之間會有數據上的影響了,保證所有的測試用例都使用相同的測試環境進行測試。

?

#include <iostream>
#include <gtest/gtest.h>
#include <unordered_map>
#include <string>class MyTest : public testing::Test
{
public:static void SetUpTestCase(){std::cout << "所有單元測試前初始化環境\n";}static void TearDownTestCase(){std::cout << "所有單元測試完畢后清理環境\n";}void SetUp() override{_mymap.insert(std::make_pair("hello", "你好"));_mymap.insert(std::make_pair("bye", "再見"));}void TearDown() override{_mymap.clear();}std::unordered_map<std::string, std::string> _mymap;
};TEST_F(MyTest, insert_test)
{_mymap.insert(std::make_pair("good", "好"));
}TEST_F(MyTest, size_test)
{ASSERT_EQ(_mymap.size(), 2);
}int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

運行結果:

[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from MyTest
所有單元測試前初始化環境
[ RUN      ] MyTest.insert_test
[       OK ] MyTest.insert_test (0 ms)
[ RUN      ] MyTest.size_test
[       OK ] MyTest.size_test (0 ms)
所有單元測試完畢后清理環境
[----------] 2 tests from MyTest (0 ms total)[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 2 tests.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web3.0 學習方案

Web3.0 學習方案 一、學習方案 &#xff08;一&#xff09;入門階段 1. 了解 Web3.0 基礎概念 學習內容&#xff1a; Web3.0 的起源、愿景、與 Web2.0 的區別區塊鏈的基本概念&#xff1a;分布式賬本、哈希、公鑰/私鑰、共識機制&#xff08;PoW、PoS、DPoS、PBFT 等&#xff0…

springboot3.5.3依賴學習

springboot3.5.3依賴學習 ? Spring Boot BOM&#xff08;spring-boot-dependencies&#xff09;是 Spring 官方維護的超級依賴清單&#xff0c;覆蓋了 Spring 生態中幾乎所有核心庫、常用工具庫及第三方依賴。其作用是統一管理這些依賴的版本&#xff0c;確保它們相互兼容。以…

制作一款打飛機游戲80:道具碰撞

目前我們仍然無法拾取這些物品&#xff0c;它們只是簡單地掉落在地上。因此&#xff0c;我們需要對這些功能進行增強。目標?彈射物品?&#xff1a;當物品生成時&#xff0c;我們希望它們能以一定的力量彈出&#xff0c;而不是無力地掉落。?添加不同類型的物品?&#xff1a;…

Python編程基礎(六)| 用戶輸入和while循環

引言 很久沒有寫 Python 了&#xff0c;有一點生疏。這是學習《Python 編程&#xff1a;從入門到實踐&#xff08;第3版&#xff09;》的課后練習記錄&#xff0c;主要目的是快速回顧基礎知識。 練習1&#xff1a;汽車租賃 編寫一個程序&#xff0c;詢問用戶要租什么樣的汽車&a…

【華為機試】HJ52 計算字符串的編輯距離

文章目錄HJ52 計算字符串的編輯距離描述輸入描述輸出描述示例1HJ52 計算字符串的編輯距離描述輸入描述輸出描述示例1解題思路算法分析動態規劃狀態轉移狀態轉移方程算法流程圖DP表格示例三種操作詳解代碼實現思路時間復雜度分析關鍵優化技巧實際應用場景算法擴展面試考點完整題…

15.手動實現BatchNorm(BN)

15.1 BatchNorm操作手動實現 import torch from torch import nndef batch_norm(X,gamma,beta,moving_mean,moving_var,eps,momentum):if not torch.is_grad_enabled():#這個是推理模式X_hat(X-moving_mean)/torch.sqrt(moving_vareps)else:assert len(X.shape) in (2,4)if le…

【項目實踐】SMBMS(Javaweb版)匯總版

文章目錄前期準備工作數據庫、數據表創建web項目創建項目文件目錄配置Tomcat&#xff0c;導入依賴建立實體類編寫基礎公共方法類導入基礎資源登錄功能登錄頁面持久層dao層的用戶登錄及接口實現dao層接口實現所需的方法業務層sevice層的接口的實現接口實現相關的業務邏輯編寫ser…

隱藏源IP的核心方案與高防實踐

一、源IP暴露的風險 直接DDoS攻擊&#xff1a;2025年Q2全球DDoS攻擊峰值達3.8Tbps&#xff08;來源&#xff1a;Cloudflare報告&#xff09;漏洞利用&#xff1a;暴露的SSH端口平均每天遭受12,000暴力破解嘗試數據泄露&#xff1a;直接連接數據庫風險提升300% 二、4種有效隱藏方…

深度學習圖像分類數據集—五種電器識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;五種電器識別分類&#xff1a;[notebook, phone, powerbank, tablet, w…

Windows11家庭版配置frigate 嵌入自研算法(基于Yolov8)-【2】

使用 YOLOv8 的 results.xyxy 結構&#xff0c;下面是一個完整的 MQTT 推送腳本&#xff0c;用于把識別到的目標&#xff08;比如突涌水、水漬、障礙物等&#xff09;發送到 Frigate 的 MQTT 接口。? 前提假設 YOLOv8 推理代碼已經運行并生成 results.xyxy。每一行是 [x1, y1,…

安裝llama-factory報錯 error: subprocess-exited-with-error

報錯信息如下 Using cached https://mirrors.aliyun.com/pypi/packages/17/89/940a509ee7e9449f0c877fa984b37b7cc485546035cc67bbc353f2ac20f3/av-15.0.0.tar.gz (3.8 MB)Preparing metadata (pyproject.toml) ... errorerror: subprocess-exited-with-error Preparing metad…

QT 多線程 管理串口

記錄一下自己使用多線程進行串口管理和數據讀取的過程。如果有問題的話可以發消息給我。背景在使用QT制作一個串口數據讀取處理的小軟件的時候&#xff0c;發現了存在界面卡頓的情況&#xff0c;感覺性能太低&#xff0c;于是考慮把串口數據的讀取和處理都放到子線程的緩沖區中…

在虛擬環境中復現論文(環境配置)

前提&#xff1a;已經下載condawinR&#xff0c;輸入cmd進入命令行conda create -n PPT python3.8.3 pytorch1.7.0conda create -n PPT(虛擬環境名) python3.8.3(包名) pytorch1.7.0(包名)安裝完畢&#xff0c;激活虛擬環境&#xff1a;conda activate PPT根據論文readme要求安…

Flutter Web 的發展歷程:Dart、Flutter 與 WasmGC

Flutter Web 應該是 Flutter 開發者里最不“受寵”的平臺了&#xff0c;但是其實 Flutter 和 Dart 團隊對于 Web 的投入一直沒有減少&#xff0c;這也和 Flutter 還有 Dart 的"出生"有關系&#xff0c;今天就借著 Dart 團隊的 mer A?acan 和 Martin Kustermann 在油…

c#方法關鍵字,ref、out、int

在 C# 中&#xff0c;ref、out 和 in 是用于方法參數傳遞的關鍵字&#xff0c;它們控制參數如何在方法和調用者之間傳遞數據。以下是對這三個關鍵字的詳細分析&#xff1a;1. ref 關鍵字&#xff08;引用傳遞&#xff09;作用允許方法修改調用者的變量&#xff1a;通過引用傳遞…

設計模式—初識設計模式

1.設計模式經典面試題分析幾個常見的設計模式對應的面試題。1.1原型設計模式1.使用UML類圖畫出原型模式核心角色&#xff08;意思就是使用會考察使用UML畫出設計模式中關鍵角色和關系圖等&#xff09;2.原型設計模式的深拷貝和淺拷貝是什么&#xff0c;寫出深拷貝的兩種方式的源…

深度學習-參數初始化、損失函數

A、參數初始化參數初始化對模型的訓練速度、收斂性以及最終的性能產生重要影響。它可以盡量避免梯度消失和梯度爆炸的情況。一、固定值初始化在神經網絡訓練開始時&#xff0c;將權重或偏置初始化為常數。但這種方法在實際操作中并不常見。1.1全零初始化將所有的權重參數初始化…

格密碼--Ring-SIS和Ring-LWE

1. 多項式環&#xff08;Polynomial Rings&#xff09; 設 f∈Z[x]f \in \mathbb{Z}[x]f∈Z[x] 是首一多項式&#xff08;最高次項系數為1&#xff09; 則環 RZ[x]/(f)R \mathbb{Z}[x]/(f)RZ[x]/(f) 元素為&#xff1a;所有次數 <deg?(f)< \deg(f)<deg(f) 的多項式…

前端工作需要和哪些人打交道?

前端工作中需要協作的角色及協作要點 前端工作中需要協作的角色及協作要點 前端開發處于產品實現的 “中間環節”,既要將設計方案轉化為可交互的界面,又要與后端對接數據,還需配合團隊推進項目進度。日常工作中,需要頻繁對接的角色包括以下幾類,每類協作都有其核心目標和…

萬字長文解析 OneCode3.0 AI創新設計

一、研究概述與背景 1.1 研究背景與意義 在 AI 技術重塑軟件開發的浪潮中&#xff0c;低代碼平臺正經歷從 “可視化編程” 到 “意圖驅動開發” 的根本性轉變。這種變革不僅提升了開發效率&#xff0c;更重新定義了人與系統的交互方式。作為國內領先的低代碼平臺&#xff0c;On…