Linux下使用merkle_tree分页哈希sqlite数据库
前言
merkle_tree选自https://github.com/blackaichi/merkle_tree.git
一、构建sqlite数据库
sqlite3下载 不过多赘述。
创建sqlite3数据库
// 头文件
#include <sqlite3.h>
//打开数据库,没有则创建
sqlite3 *db;
if(SQLITE_OK != sqlite3_open("book.db",&db) )
{
printf("sqlite3_open error\n");
exit(1);
}
const char *sql = "CREATE TABLE IF NOT EXISTS book\
(book_num int primary key,\
book_name NOT NULL,\
price real);";
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg) )
{
printf("表创建失败!\n");
return 0;
}
insert_values(db);
sqlite3_close(db);
return 0;
插入数据
void insert_values(sqlite3 *db)
{
char *sql;
char *book_name;
int book_num;
float price;
book_num = 0;
price = 100;
book_name = "tflgrtflgr";
for(int i=0;i<10;i++){
sql = sqlite3_mprintf("insert into book values('%d', '%s', '%f')", book_num, book_name, price);
book_num++;
if(SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, &errmsg))
{
printf("sqlite3_exec insert error\n");
exit(1);
}
else
printf("插入成功!\n");
}
return;
}
至此成功会生成book.db数据库
二、构建merkle_tree
1.git源码 根据readme 进行配置
代码如下:
## Merkle Tree implementation in C++
To execute:
```console
foo@bar:~$ make all
g++ -c main.cc
g++ -c merkle_tree.cc
g++ -c node.cc
g++ merkle_tree.o node.o main.o -lcrypto -o main.x
foo@bar:~$ ./main.x
And follow steps
Also you can use:
console
foo@bar:~$ make clean
rm *.o ./nodes/*
To clean all .o and the folder nodes.
Output
The program will generate a report document in the directory where you execute the program and the nodes in the "./nodes" folder. Also the program can generate more docs in the folder "./docs"
2.分析merkle_tree源码做出修改
首先 我们要获取到sqlite的数据库文件内容,main.cc中main函数vector<string> data, hash, names;
这三个数组为获取的数据,hash值和生成的结点名字,通过sqlite3语句limit
完成分页构建,函数具体代码如下:
void selectdb(sqlite3 *db, vector<string> &data, vector<string> &names){
string temp;
char **pResult;
int row, column, i, j, index;
int x = 0;
char *errmsg;
while(1)
{
temp = "";
char *sql = sqlite3_mprintf("select * from book Limit 4 Offset '%d'",x);
if(SQLITE_OK != sqlite3_get_table(db,sql,&pResult,&row,&column,&errmsg) )
{
printf("can not get table\n");
//exit(1);
break;
}
if(row == 0)
{
break;
}
index = column;
for(i=0; i<row; i++)
{
for(j=0; j<column; j++)
{
temp += pResult[index++];
}
}
data.push_back(temp);
names.push_back(to_string(x/4));
x += 4;
}
return
}
最后结果存入nodes文件中
PS:nodes文件夹需自己创建,每个node文件里存为每个结点的hash值,层层hash直到父节点,这里为数据库每四个数据进行hash操作,然后存入结点中。
总结
简单了解了merkle_tree和sqlite的用法,将他们结合目的是为了后面的项目课题而完成的前序工作。源码文件会上传至csdn,以供参考。