国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹

這篇具有很好參考價(jià)值的文章主要介紹了【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. Merkle樹簡(jiǎn)介

【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹,c語(yǔ)言,區(qū)塊鏈,信任鏈,去中心化

??如上圖所示,Merkle 樹的葉子節(jié)點(diǎn)為交易序列,對(duì)每一筆交易進(jìn)行 Hash(SHA 256算法) 之后,然后對(duì)得到的 Hash 節(jié)點(diǎn)進(jìn)行拼接再次進(jìn)行 Hash 運(yùn)算,如此遞歸直到遞歸至根節(jié)點(diǎn)。

【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹,c語(yǔ)言,區(qū)塊鏈,信任鏈,去中心化

??如上圖所示 Merkle 樹的優(yōu)點(diǎn)在于可快速驗(yàn)證某個(gè)區(qū)塊是否存在指定交易,如要驗(yàn)證 H k H_k Hk?是否存在于該區(qū)塊中,只要將 H L 、 H I J 、 H M N O P 、 H A B C D E F G H_L、H_{IJ}、H_{MNOP}、H_{ABCDEFG} HL?、HIJ?HMNOP?、HABCDEFG?節(jié)點(diǎn)得到,然后從下到上不斷 Hash,最后與根節(jié)點(diǎn)的 Hash 值進(jìn)行比較,就可以快速判斷交易是否在該區(qū)塊中。

2. 構(gòu)建Merkle樹

  1. 頭文件及Merkle節(jié)點(diǎn)類型
# include <iostream>
# include <functional>
# include<string>
using namespace std;
typedef struct MerkleNode {
	MerkleNode* Left;
	MerkleNode* Middle;
	MerkleNode* Right;
	MerkleNode* parent;
	size_t data;
};
struct MerkleTree {
	MerkleNode* RootNode;
}root;
  1. 創(chuàng)建三叉merkle所需函數(shù)
/* 創(chuàng)建merkle樹 */
MerkleNode* queue[100000];
int front = 0, rear = 0, new_rear = 0;
int n;
// 字符串加密
size_t encrypt(string strInput)
{
	hash<string> Hash;
	size_t hashVal = Hash(strInput);
	return hashVal;
}

// size_t轉(zhuǎn)換為字符串
string type_convert(size_t input)
{
	string output = to_string(input);
	return output;
}

// 字符串拼接
string concat(string one, string two,string three)
{
	string output = one + two + three;
	return output;
}

// 初始化葉子節(jié)點(diǎn)
void init_leaf_node(MerkleNode*& node,size_t data)
{
	node = (MerkleNode*)malloc(sizeof(MerkleNode));
	node->data = encrypt(type_convert(data));
	node->Left = NULL;
	node->Middle = NULL;
	node->Right = NULL;
}

// 對(duì)最后一個(gè)節(jié)點(diǎn)進(jìn)行拷貝
MerkleNode* copy_node(MerkleNode* node)
{
	MerkleNode* new_node = (MerkleNode*)malloc(sizeof(MerkleNode));
	new_node->Left = NULL;
	new_node->Middle = NULL;
	new_node->Right = NULL;
	new_node->data = node->data;
	return new_node;
}

// 初始化分枝節(jié)點(diǎn)
void init_branch_node(MerkleNode* Left, MerkleNode* Middle, MerkleNode* Right)
{
	MerkleNode* node = (MerkleNode*)malloc(sizeof(MerkleNode));
	node->Left = Left;
	node->Middle = Middle;
	node->Right = Right;
	Left->parent = node;
	Middle->parent = node;
	Right->parent = node;
	node->data = encrypt(concat(type_convert(Left->data), type_convert(Middle->data), type_convert(Right->data)));
	queue[new_rear++] = node;
}

// 根據(jù)隊(duì)列中的節(jié)點(diǎn)生成其父節(jié)點(diǎn)
void create_new_layer()
{
	// 補(bǔ)足剩余節(jié)點(diǎn)
	int remainder = rear % 3;
	int res = 0;
	if (remainder != 0)
	{
		res = 3 - remainder;
		MerkleNode* node = queue[rear - 1];
		for (int i = 0; i < res; i++)
		{
			queue[rear++] = copy_node(node);
		}
	}

	int loop = (rear + res) / 3;


	for (int i = 0; i < loop; i++)
	{
		MerkleNode* Left = queue[front++];
		MerkleNode* Middle = queue[front++];
		MerkleNode* Right = queue[front++];
		init_branch_node(Left, Middle, Right);
	}
	rear = new_rear;
	new_rear = 0;
	front = 0;
}

// 創(chuàng)建merkle樹
void create_merkle_tree(MerkleTree*& root)
{
	while (rear != 1)
	{
		create_new_layer();
	}
	root = (MerkleTree*)malloc(sizeof(MerkleTree));
	root->RootNode = queue[rear-1];
	root->RootNode->parent = NULL;
}

// 輸入數(shù)據(jù)
void init_data()
{
	cout << "請(qǐng)輸入交易序列個(gè)數(shù):";
	cin >> n;
	cout << "請(qǐng)輸入每一筆交易(中間以空格隔開):";
	for (int i = 0; i < n; i++)
	{
		MerkleNode* node;
		size_t data;
		cin >> data;
		init_leaf_node(node, data);
		queue[rear++] = node;
	}
}

3. 生成SPV路徑

SPV路徑生成代碼:

/*  生成SPV路徑  */ 
size_t spv_queue[100010];
MerkleNode *sequence[100010];
int seq_front = 0, seq_rear = 0;
int spv_front = 0,spv_rear = 0;
int spv_flag[100010], flag_idx = 0;

void init_all_node_sequence(MerkleNode* node)
{
	sequence[++seq_rear] = node;
	while (seq_front != seq_rear)
	{
		MerkleNode* new_node = sequence[++seq_front];
		if (new_node->Left != NULL)
		{
			sequence[++seq_rear] = new_node->Left;
		}
		if (new_node->Middle != NULL)
		{
			sequence[++seq_rear] = new_node->Middle;
		}
		if (new_node->Right != NULL)
		{
			sequence[++seq_rear] = new_node->Right;
		}
	}
	seq_front = 0;
}

void init_spv_path(int idx,MerkleTree *root)
{
	MerkleNode* head_node = root->RootNode;
	init_all_node_sequence(head_node);

	int cnt;
	if (n % 3 == 0)
	{
		cnt = 3;
	}
	else if((n + 1) % 3 == 0) {
		cnt = n + 1;
	}
	else {
		cnt = n + 2;
	}
	int seq_idx = seq_rear - (cnt - idx);
	cout << "該交易的哈希值為:" << sequence[seq_idx]->data<< endl;

	MerkleNode* node = sequence[seq_idx];

	while (node->parent)
	{
		MerkleNode* parent = node->parent;
		if (node == parent->Left)
		{
			spv_flag[flag_idx++] = 0;
			spv_queue[++spv_rear] = parent->Middle->data;
			spv_queue[++spv_rear] = parent->Right->data;
		}
		else if (node == parent->Middle)
		{
			spv_flag[flag_idx++] = 1;
			spv_queue[++spv_rear] = parent->Left->data;
			spv_queue[++spv_rear] = parent->Right->data;
		}
		else {
			spv_flag[flag_idx++] = 2;
			spv_queue[++spv_rear] = parent->Left->data;
			spv_queue[++spv_rear] = parent->Middle->data;
		}
		node = node->parent;
	}

}

void print_spv_path(int idx)
{
	cout << "交易序列號(hào)" << idx << "的SPV路徑為:";
	while (spv_front != spv_rear)
	{
		cout << spv_queue[++spv_front] << " ";
	}
	cout << endl;
	spv_front = 0;
	cout << "生成交易在其兄弟節(jié)點(diǎn)中的位置序列為(0為L(zhǎng)eft,1為Middle,2為Right):";
	for (int i = 0; i < flag_idx; i++)
	{
		cout << spv_flag[i] << " ";
	}
}

4. 驗(yàn)證SPV路徑

SPV路徑驗(yàn)證代碼:

/* 驗(yàn)證SPV路徑 */
size_t root_hash, spv_path[1010], hash_val;
int spv_length;
void judge_spv_path()
{
	cout << "請(qǐng)輸入merkle樹根節(jié)點(diǎn)哈希值:";
	cin >> root_hash;

	cout << "請(qǐng)輸入SPV路徑長(zhǎng)度:";
	cin >> spv_length;
	cout << "請(qǐng)輸入SPV路徑(中間用空格隔開):";
	for (int i = 0; i < spv_length; i++)
	{
		cin >> spv_path[i];
	}

	int pos_cnt, pos_sqe[100010];
	cout << "請(qǐng)輸入交易位置序列個(gè)數(shù):";
	cin >> pos_cnt;
	cout << "請(qǐng)輸入交易位置序列(中間用空格隔開):";
	for (int i = 0; i < pos_cnt; i++)
	{
		cin >> pos_sqe[i];
	}

	cout << "請(qǐng)輸入要查詢的交易哈希值:";
	cin >> hash_val;

	int path_idx = 0, pos_idx = 0;
	while (path_idx != spv_length)
	{
		size_t one = spv_path[path_idx++];
		size_t two = spv_path[path_idx++];
		if (pos_sqe[pos_idx] == 0)
		{
			hash_val = encrypt(concat(type_convert(hash_val), type_convert(one), type_convert(two)));
		}
		else if (pos_sqe[pos_idx] == 1)
		{
			hash_val = encrypt(concat(type_convert(one), type_convert(hash_val), type_convert(two)));
		}
		else {
			hash_val = encrypt(concat(type_convert(one), type_convert(two), type_convert(hash_val)));
		}
		pos_idx++;
	}
	cout << "SPV計(jì)算得到的哈希值為:" << hash_val <<endl;
	cout << "頭節(jié)點(diǎn)哈希值為:" << root_hash << endl;
	if (hash_val == root_hash)
	{
		cout << "SPV路徑驗(yàn)證成功?。?!" << endl << endl << endl;
	}
}

5. 三叉Merkle樹創(chuàng)建、SPV生成及驗(yàn)證總程序

# define _CRT_SECURE_NO_DEPRECATE
# include <iostream>
# include <functional>
# include<string>
using namespace std;
typedef struct MerkleNode {
	MerkleNode* Left;
	MerkleNode* Middle;
	MerkleNode* Right;
	MerkleNode* parent;
	size_t data;
};
struct MerkleTree {
	MerkleNode* RootNode;
}root;

/* 創(chuàng)建merkle樹 */
MerkleNode* queue[100000];
int front = 0, rear = 0, new_rear = 0;
int n;
// 字符串加密
size_t encrypt(string strInput)
{
	hash<string> Hash;
	size_t hashVal = Hash(strInput);
	return hashVal;
}

// size_t轉(zhuǎn)換為字符串
string type_convert(size_t input)
{
	string output = to_string(input);
	return output;
}

// 字符串拼接
string concat(string one, string two,string three)
{
	string output = one + two + three;
	return output;
}

// 初始化葉子節(jié)點(diǎn)
void init_leaf_node(MerkleNode*& node,size_t data)
{
	node = (MerkleNode*)malloc(sizeof(MerkleNode));
	node->data = encrypt(type_convert(data));
	node->Left = NULL;
	node->Middle = NULL;
	node->Right = NULL;
}

// 對(duì)最后一個(gè)節(jié)點(diǎn)進(jìn)行拷貝
MerkleNode* copy_node(MerkleNode* node)
{
	MerkleNode* new_node = (MerkleNode*)malloc(sizeof(MerkleNode));
	new_node->Left = NULL;
	new_node->Middle = NULL;
	new_node->Right = NULL;
	new_node->data = node->data;
	return new_node;
}

// 初始化分枝節(jié)點(diǎn)
void init_branch_node(MerkleNode* Left, MerkleNode* Middle, MerkleNode* Right)
{
	MerkleNode* node = (MerkleNode*)malloc(sizeof(MerkleNode));
	node->Left = Left;
	node->Middle = Middle;
	node->Right = Right;
	Left->parent = node;
	Middle->parent = node;
	Right->parent = node;
	node->data = encrypt(concat(type_convert(Left->data), type_convert(Middle->data), type_convert(Right->data)));
	queue[new_rear++] = node;
}

// 根據(jù)隊(duì)列中的節(jié)點(diǎn)生成其父節(jié)點(diǎn)
void create_new_layer()
{
	// 補(bǔ)足剩余節(jié)點(diǎn)
	int remainder = rear % 3;
	int res = 0;
	if (remainder != 0)
	{
		res = 3 - remainder;
		MerkleNode* node = queue[rear - 1];
		for (int i = 0; i < res; i++)
		{
			queue[rear++] = copy_node(node);
		}
	}

	int loop = (rear + res) / 3;


	for (int i = 0; i < loop; i++)
	{
		MerkleNode* Left = queue[front++];
		MerkleNode* Middle = queue[front++];
		MerkleNode* Right = queue[front++];
		init_branch_node(Left, Middle, Right);
	}
	rear = new_rear;
	new_rear = 0;
	front = 0;
}

// 創(chuàng)建merkle樹
void create_merkle_tree(MerkleTree*& root)
{
	while (rear != 1)
	{
		create_new_layer();
	}
	root = (MerkleTree*)malloc(sizeof(MerkleTree));
	root->RootNode = queue[rear-1];
	root->RootNode->parent = NULL;
}

// 輸入數(shù)據(jù)
void init_data()
{
	cout << "請(qǐng)輸入交易序列個(gè)數(shù):";
	cin >> n;
	cout << "請(qǐng)輸入每一筆交易(中間以空格隔開):";
	for (int i = 0; i < n; i++)
	{
		MerkleNode* node;
		size_t data;
		cin >> data;
		init_leaf_node(node, data);
		queue[rear++] = node;
	}
}



/*  生成SPV路徑  */ 
size_t spv_queue[100010];
MerkleNode *sequence[100010];
int seq_front = 0, seq_rear = 0;
int spv_front = 0,spv_rear = 0;
int spv_flag[100010], flag_idx = 0;

void init_all_node_sequence(MerkleNode* node)
{
	sequence[++seq_rear] = node;
	while (seq_front != seq_rear)
	{
		MerkleNode* new_node = sequence[++seq_front];
		if (new_node->Left != NULL)
		{
			sequence[++seq_rear] = new_node->Left;
		}
		if (new_node->Middle != NULL)
		{
			sequence[++seq_rear] = new_node->Middle;
		}
		if (new_node->Right != NULL)
		{
			sequence[++seq_rear] = new_node->Right;
		}
	}
	seq_front = 0;
}

void init_spv_path(int idx,MerkleTree *root)
{
	MerkleNode* head_node = root->RootNode;
	init_all_node_sequence(head_node);

	int cnt;
	if (n % 3 == 0)
	{
		cnt = 3;
	}
	else if((n + 1) % 3 == 0) {
		cnt = n + 1;
	}
	else {
		cnt = n + 2;
	}
	int seq_idx = seq_rear - (cnt - idx);
	cout << "該交易的哈希值為:" << sequence[seq_idx]->data<< endl;

	MerkleNode* node = sequence[seq_idx];

	while (node->parent)
	{
		MerkleNode* parent = node->parent;
		if (node == parent->Left)
		{
			spv_flag[flag_idx++] = 0;
			spv_queue[++spv_rear] = parent->Middle->data;
			spv_queue[++spv_rear] = parent->Right->data;
		}
		else if (node == parent->Middle)
		{
			spv_flag[flag_idx++] = 1;
			spv_queue[++spv_rear] = parent->Left->data;
			spv_queue[++spv_rear] = parent->Right->data;
		}
		else {
			spv_flag[flag_idx++] = 2;
			spv_queue[++spv_rear] = parent->Left->data;
			spv_queue[++spv_rear] = parent->Middle->data;
		}
		node = node->parent;
	}

}

void print_spv_path(int idx)
{
	cout << "交易序列號(hào)" << idx << "的SPV路徑為:";
	while (spv_front != spv_rear)
	{
		cout << spv_queue[++spv_front] << " ";
	}
	cout << endl;
	spv_front = 0;
	cout << "生成交易在其兄弟節(jié)點(diǎn)中的位置序列為(0為L(zhǎng)eft,1為Middle,2為Right):";
	for (int i = 0; i < flag_idx; i++)
	{
		cout << spv_flag[i] << " ";
	}
}

/* 驗(yàn)證SPV路徑 */
size_t root_hash, spv_path[1010], hash_val;
int spv_length;
void judge_spv_path()
{
	cout << "請(qǐng)輸入merkle樹根節(jié)點(diǎn)哈希值:";
	cin >> root_hash;

	cout << "請(qǐng)輸入SPV路徑長(zhǎng)度:";
	cin >> spv_length;
	cout << "請(qǐng)輸入SPV路徑(中間用空格隔開):";
	for (int i = 0; i < spv_length; i++)
	{
		cin >> spv_path[i];
	}

	int pos_cnt, pos_sqe[100010];
	cout << "請(qǐng)輸入交易位置序列個(gè)數(shù):";
	cin >> pos_cnt;
	cout << "請(qǐng)輸入交易位置序列(中間用空格隔開):";
	for (int i = 0; i < pos_cnt; i++)
	{
		cin >> pos_sqe[i];
	}

	cout << "請(qǐng)輸入要查詢的交易哈希值:";
	cin >> hash_val;

	int path_idx = 0, pos_idx = 0;
	while (path_idx != spv_length)
	{
		size_t one = spv_path[path_idx++];
		size_t two = spv_path[path_idx++];
		if (pos_sqe[pos_idx] == 0)
		{
			hash_val = encrypt(concat(type_convert(hash_val), type_convert(one), type_convert(two)));
		}
		else if (pos_sqe[pos_idx] == 1)
		{
			hash_val = encrypt(concat(type_convert(one), type_convert(hash_val), type_convert(two)));
		}
		else {
			hash_val = encrypt(concat(type_convert(one), type_convert(two), type_convert(hash_val)));
		}
		pos_idx++;
	}
	cout << "SPV計(jì)算得到的哈希值為:" << hash_val <<endl;
	cout << "頭節(jié)點(diǎn)哈希值為:" << root_hash << endl;
	if (hash_val == root_hash)
	{
		cout << "SPV路徑驗(yàn)證成功?。?!" << endl << endl << endl;
	}
}



int main()
{

	cout << "================================================  Merkle樹構(gòu)建部分  ===================================================" << endl << endl;
	init_data();	// 數(shù)據(jù)初始化(輸入相關(guān)數(shù)據(jù))
	// 生成 Merkle 樹
	MerkleTree* root;
	create_merkle_tree(root);
	cout << "merkle樹根哈希值為:" << root->RootNode->data << endl;
	cout << "merkle樹構(gòu)建完成!" << endl << endl << endl;

	// 生成SPV路徑
	cout << "================================================  SPV路徑生成部分  ===================================================" << endl << endl;
	int idx;
	cout << "請(qǐng)輸入交易序號(hào)(i):";
	cin >> idx;
	init_spv_path(idx, root);
	print_spv_path(idx);
	cout << endl << endl << endl;

	// 驗(yàn)證SPV路徑
	cout << "================================================  SPV路徑驗(yàn)證部分  ===================================================" << endl << endl;
	judge_spv_path();

	return 0;
}

6. 程序運(yùn)行結(jié)果

【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹,c語(yǔ)言,區(qū)塊鏈,信任鏈,去中心化文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850560.html

到了這里,關(guān)于【區(qū)塊鏈】C語(yǔ)言編程實(shí)現(xiàn)三叉Merkle樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 用C語(yǔ)言編程實(shí)現(xiàn)兩個(gè)字符串?dāng)?shù)組的連接

    用C語(yǔ)言編程實(shí)現(xiàn)兩個(gè)字符串?dāng)?shù)組的連接

    寫一函數(shù),將兩個(gè)字符串連接。不要使用 strcat 函數(shù)。 說(shuō)明: (1)連接兩個(gè)字符串的函數(shù)名為:Connect; (2)將連個(gè)字符串存入兩個(gè)字符串?dāng)?shù)組中,要保證第一個(gè)字符串的長(zhǎng)度能夠容納兩個(gè)字符串之和; (3)連接兩個(gè)字符串主要是找到第一個(gè)字符串的結(jié)尾,然后將第二個(gè)字

    2024年02月12日
    瀏覽(24)
  • 【C語(yǔ)言】C語(yǔ)言編程實(shí)戰(zhàn):Base64編解碼算法從理論到實(shí)現(xiàn)(附完整代碼)

    ?? 作者簡(jiǎn)介 :阿里巴巴嵌入式技術(shù)專家,深耕嵌入式+人工智能領(lǐng)域,具備多年的嵌入式硬件產(chǎn)品研發(fā)管理經(jīng)驗(yàn)。 ?? 博客介紹 :分享嵌入式開發(fā)領(lǐng)域的相關(guān)知識(shí)、經(jīng)驗(yàn)、思考和感悟,歡迎關(guān)注。提供嵌入式方向的學(xué)習(xí)指導(dǎo)、簡(jiǎn)歷面試輔導(dǎo)、技術(shù)架構(gòu)設(shè)計(jì)優(yōu)化、開發(fā)外包等服

    2024年03月13日
    瀏覽(102)
  • Ubuntu22.2下C語(yǔ)言編程實(shí)現(xiàn),首次,最佳適應(yīng)算法

    Ubuntu22.2下C語(yǔ)言編程實(shí)現(xiàn),首次,最佳適應(yīng)算法

    編寫C語(yǔ)言程序,模擬實(shí)現(xiàn)首次/最佳/最壞適應(yīng)算法(選擇其中之一即可)的內(nèi)存塊分配和回收,要求每次分配和回收后顯示出空閑分區(qū)和已分配分區(qū)的情況。假設(shè)初始狀態(tài)下,可用的內(nèi)存空間為640KB。 假設(shè)下列作業(yè)請(qǐng)求序列: (1)作業(yè)1 申請(qǐng)130 KB (2)作業(yè)2 申請(qǐng)60 KB (3)作業(yè)

    2024年02月05日
    瀏覽(23)
  • C語(yǔ)言編程實(shí)現(xiàn),計(jì)算每天進(jìn)步一點(diǎn)點(diǎn)一年后的效果

    C語(yǔ)言編程實(shí)現(xiàn),計(jì)算每天進(jìn)步一點(diǎn)點(diǎn)一年后的效果

    本來(lái)的基數(shù)為1,如果好好學(xué)習(xí)時(shí)能力值相比前一天提高1%,當(dāng)放任時(shí)相比前一天下降1%。1年(365天)后的效果相差多少呢? 原基數(shù)為1,努力一天進(jìn)步1%,效果1*(1+0.01),努力兩天是在前一天的基礎(chǔ)上進(jìn)步1%,結(jié)果是1*(1+0.01)*(1+0.01),一年后天天向上的力量是(1+0.01)的365次方。

    2024年02月11日
    瀏覽(25)
  • C語(yǔ)言網(wǎng)絡(luò)編程:實(shí)現(xiàn)自己的高性能網(wǎng)絡(luò)框架

    C語(yǔ)言網(wǎng)絡(luò)編程:實(shí)現(xiàn)自己的高性能網(wǎng)絡(luò)框架

    一般生產(chǎn)環(huán)境中最耗時(shí)的其實(shí)是業(yè)務(wù)邏輯處理。所以,是不是可以將處理業(yè)務(wù)邏輯的代碼給拆出來(lái)丟到線程池中去執(zhí)行。 比如像下面這樣: ?我們事先創(chuàng)建好一堆worker線程,主線程accepter拿到一個(gè)連接上來(lái)的套接字,就從線程池中取出一個(gè)線程將這個(gè)套接字交給它。這樣,我

    2024年02月10日
    瀏覽(24)
  • 函數(shù)探秘:深入理解C語(yǔ)言函數(shù),實(shí)現(xiàn)高效模塊化編程

    函數(shù)探秘:深入理解C語(yǔ)言函數(shù),實(shí)現(xiàn)高效模塊化編程

    ?? 歡迎大家來(lái)到貝蒂大講堂?? ????養(yǎng)成好習(xí)慣,先贊后看哦~???? 所屬專欄:C語(yǔ)言學(xué)習(xí) 貝蒂的主頁(yè):Betty‘s blog 在數(shù)學(xué)中我們就知道了函數(shù)這個(gè)概念,而C語(yǔ)言同樣引入了函數(shù)這個(gè)概念,那C語(yǔ)言的函數(shù)到底是什么樣的呢? 在C語(yǔ)言中, 函數(shù)也叫子程序,它是一段可以

    2024年03月09日
    瀏覽(96)
  • 馬上七夕到了,用各種編程語(yǔ)言實(shí)現(xiàn)10種浪漫表白方式

    馬上七夕到了,用各種編程語(yǔ)言實(shí)現(xiàn)10種浪漫表白方式

    在七夕節(jié)這個(gè)充滿愛(ài)意的日子里,用編程語(yǔ)言編寫一些表白代碼是個(gè)非常有趣的想法。以下是使用 各種編程語(yǔ)言Python、Java、JavaScript、H5等編寫的 10 種簡(jiǎn)單表白代碼示例,以下只是拋磚引玉,還需要你用心修改,對(duì)方一定能理解你的真心。 這段代碼使用 Python 的 Matplotlib 庫(kù)繪

    2024年02月12日
    瀏覽(21)
  • FFT原理(基2DIT-FFT)及C語(yǔ)言編程思路及實(shí)現(xiàn)

    FFT原理(基2DIT-FFT)及C語(yǔ)言編程思路及實(shí)現(xiàn)

    首先說(shuō)明:采用的是基2時(shí)域抽取法(Decimation-In-Time FFT 簡(jiǎn)稱DIT-FFT)。 ????????FFT實(shí)際上是對(duì)DFT的一種快速實(shí)現(xiàn)算法,實(shí)質(zhì)上就是對(duì)DFT抽取,以8點(diǎn)DFT為例:可以分解為兩個(gè)4點(diǎn)DFT,在繼續(xù)分解為4個(gè)兩點(diǎn)DFT,從而縮小DFT運(yùn)算量,提高運(yùn)算效率。(因此首先需要理解DFT算法和它

    2023年04月10日
    瀏覽(17)
  • 【C語(yǔ)言實(shí)現(xiàn)windows環(huán)境下Socket編程TCP/IP協(xié)議】

    代碼是別人的,問(wèn)題是我的。順便記錄一下遇見(jiàn)的各種問(wèn)題和我的解決辦法。 可能的解決方案: 1、服務(wù)端和客戶端不在一個(gè)局域網(wǎng),可以開熱點(diǎn),這樣就在了。然后ipconfig查看IP地址,就ok了。至于怎么查看在不在就ping一下對(duì)方就好了。 2、一個(gè)局域網(wǎng)下也ping不通:看看自己

    2024年02月04日
    瀏覽(23)
  • 判斷字符串是否為回文的三種常用編程語(yǔ)言實(shí)現(xiàn)

    引言:回文是一種具有鏡像對(duì)稱性的字符串,即它從左到右讀和從右到左讀是相同的?;匚目梢栽谖膶W(xué)、語(yǔ)言學(xué)、數(shù)學(xué)、計(jì)算機(jī)科學(xué)等領(lǐng)域中得到廣泛應(yīng)用。在計(jì)算機(jī)科學(xué)中,判斷一個(gè)字符串是否為回文是一項(xiàng)基本的算法挑戰(zhàn)。在本文中,我們將介紹三種常見(jiàn)的編程語(yǔ)言中用

    2024年02月03日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包