Softhsm储存安全数据性能整理
目标:存储百万条数据对象
测试方案一:总大小2GB,每个数据对象大小约512KB,总条数4096条;
测试方案一:总大小2GB,每个数据对象大小约256B,总条数8388608条;
测试环境:启动SQLite3
配置CMakeLists.txt,打开所有SQLite3相关宏开关
option(WITH_OBJECTSTORE_BACKEND_DB "Build with object store backend database (SQLite3)" ON)
option(WITH_MIGRATE "Build migration tool. Requires SQLit3." ON)
set(DEFAULT_OBJECTSTORE_BACKEND "db" CACHE STRING "Default storage backend for token objects")
修改配置文件,原始文件为softhms/src/lib/common/softhsm2.conf.5.in,构建完成后位于/etc/softhsm.conf,默认file改为db
directories.tokendir = @softhsmtokendir@
objectstore.backend = db
objectstore.umask = 0077
至此创建的token和各类对象将存储到配置路径下的sqlite3.db中
测试脚本:write_objects.sh
#!/bin/bash# SoftHSM 配置
SOFTHSM_MODULE="/home/ubuntu/Documents/HSM/20250106/SoftHSMv2_bgk/build/src/lib/libsofthsm2.so" # SoftHSM 模块路径
TOKEN_DIR="/var/lib/softhsm/tokens/" # Token 目录
SLOT=0 # Slot 编号
PIN="1234" # Token PIN
LABEL_PREFIX="DataObject" # 数据对象标签前缀
DATA_SIZE=64 # 每个数据对象的大小(字节)# 检查 SoftHSM 模块是否存在
if [ ! -f "$SOFTHSM_MODULE" ]; thenecho "SoftHSM 模块未找到: $SOFTHSM_MODULE"exit 1
fi# 检查 Token 目录是否存在
if [ ! -d "$TOKEN_DIR" ]; thenecho "Token 目录未找到: $TOKEN_DIR"exit 1
fi# 初始化计数器
COUNTER=1
MAX_COUNT=10# 循环写入数据对象
while [ $COUNTER -le $MAX_COUNT ]; do# 生成随机数据DATA=$(openssl rand -hex $DATA_SIZE)# 生成唯一的标签和 IDLABEL="${LABEL_PREFIX}_${COUNTER}"ID=$(printf "%04x" $COUNTER)# 写入数据对象echo "$DATA" > /tmp/data.binSTART_TIME=$(date +%s%3N)./pkcs11-tool --module "$SOFTHSM_MODULE" --login --pin "$PIN" --write-object /tmp/data.bin --type data --id "$ID" --label "$LABEL"END_TIME=$(date +%s%3N)DIFF=$((END_TIME - START_TIME))DIFF=$((END_TIME - START_TIME))if [ $DIFF -lt 0 ]; thenDIFF=$((START_TIME - END_TIME))fiecho "Execute Time: ${DIFF} ms"# 检查是否成功if [ $? -eq 0 ]; thenecho "已写入数据对象: ID=$ID, 标签=$LABEL"elseecho "写入数据对象失败: ID=$ID, 标签=$LABEL"exit 1fi# 增加计数器COUNTER=$((COUNTER + 1))
doneecho "已完成写入 $MAX_COUNT 个数据对象。"
测试性能(数据块大小512KB,初始数据库为空,连续存入100次,性能衰减非常严重):
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_1;type=data
Execute Time: 15 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_2;type=data
Execute Time: 17 ms
已写入数据对象: ID=0002, 标签=DataObject_2
Created Data Object:
Data object 2label: 'DataObject_3'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_3;type=data
Execute Time: 17 ms
已写入数据对象: ID=0003, 标签=DataObject_3
...
...
...
Created Data Object:
Data object 2label: 'DataObject_98'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_98;type=data
Execute Time: 224 ms
已写入数据对象: ID=0062, 标签=DataObject_98
Created Data Object:
Data object 2label: 'DataObject_99'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_99;type=data
Execute Time: 233 ms
已写入数据对象: ID=0063, 标签=DataObject_99
Created Data Object:
Data object 2label: 'DataObject_100'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=426447c3de082349;token=SQLite3Token;object=DataObject_100;type=data
Execute Time: 216 ms
已写入数据对象: ID=0064, 标签=DataObject_100
已完成写入 100 个数据对象。
测试性能(数据块大小256Bytes,初始数据库为空,连续存入100次,性能衰减不明显):
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_1;type=data
Execute Time: 15 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x1561dfeb)
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_2;type=data
Execute Time: 14 ms
已写入数据对象: ID=0002, 标签=DataObject_2
Using slot 0 with a present token (0x1561dfeb)
Created Data Object:
Data object 2label: 'DataObject_3'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_3;type=data
Execute Time: 14 ms
已写入数据对象: ID=0003, 标签=DataObject_3
...
...
...
Created Data Object:
Data object 2label: 'DataObject_998'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_998;type=data
Execute Time: 18 ms
已写入数据对象: ID=03e6, 标签=DataObject_998
Using slot 0 with a present token (0x1561dfeb)
Created Data Object:
Data object 2label: 'DataObject_999'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_999;type=data
Execute Time: 15 ms
已写入数据对象: ID=03e7, 标签=DataObject_999
Using slot 0 with a present token (0x1561dfeb)
Created Data Object:
Data object 2label: 'DataObject_1000'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=b53fedf69561dfeb;token=SQLite3Token;object=DataObject_1000;type=data
Execute Time: 16 ms
已写入数据对象: ID=03e8, 标签=DataObject_1000
已完成写入 1000 个数据对象。
交叉测试(构造初始数据库为200MB,再存入小数据块,测试存储性能):
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_1;type=data
Execute Time: 64 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_2;type=data
Execute Time: 82 ms
已写入数据对象: ID=0002, 标签=DataObject_2
...
...
...
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_19'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_19;type=data
Execute Time: 594 ms
已写入数据对象: ID=0013, 标签=DataObject_19
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_20'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_20;type=data
Execute Time: 627 ms
已写入数据对象: ID=0014, 标签=DataObject_20
已完成写入 20 个数据对象。
前置条件:构造10MB数据块,连续存入20次,获得196MB的初始数据库大小
ubuntu@ubuntu-vm:/var/lib/softhsm/tokens/30378c01-c782-32c2-4c32-252ac7b89b8b$ ls -lh
total 196M
-rw------- 1 ubuntu ubuntu 196M 2月 11 17:28 sqlite3.db
ubuntu@ubuntu-vm:/var/lib/softhsm/tokens/30378c01-c782-32c2-4c32-252ac7b89b8b$
测试性能(构造初始数据库为196MB,数据块大小256Bytes,连续存入3次,性能衰减明显):
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_1;type=data
Execute Time: 607 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_2;type=data
Execute Time: 607 ms
已写入数据对象: ID=0002, 标签=DataObject_2
Using slot 0 with a present token (0x47b89b8b)
Created Data Object:
Data object 2label: 'DataObject_3'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=4c32252ac7b89b8b;token=SQLite3Token;object=DataObject_3;type=data
Execute Time: 596 ms
已写入数据对象: ID=0003, 标签=DataObject_3
已完成写入 3 个数据对象。
测试脚本:read_objects.sh
#!/bin/bash# SoftHSM 配置
SOFTHSM_MODULE="/home/ubuntu/Documents/HSM/20250106/SoftHSMv2_bgk/build/src/lib/libsofthsm2.so" # SoftHSM 模块路径
TOKEN_DIR="/var/lib/softhsm/tokens/" # Token 目录
SLOT=0 # Slot 编号
PIN="1234" # Token PIN
LABEL_PREFIX="DataObject" # 数据对象标签前缀
DATA_SIZE=128 # 每个数据对象的大小(字节)# 检查 SoftHSM 模块是否存在
if [ ! -f "$SOFTHSM_MODULE" ]; thenecho "SoftHSM 模块未找到: $SOFTHSM_MODULE"exit 1
fi# 检查 Token 目录是否存在
if [ ! -d "$TOKEN_DIR" ]; thenecho "Token 目录未找到: $TOKEN_DIR"exit 1
fi# 初始化计数器
COUNTER=1
MAX_COUNT=1# 循环写入数据对象
while [ $COUNTER -le $MAX_COUNT ]; do# 生成随机数据# DATA=$(openssl rand -hex $DATA_SIZE)# 生成唯一的标签和 ID# LABEL="${LABEL_PREFIX}_${COUNTER}"# ID=$(printf "%04x" $COUNTER)# 写入数据对象# echo "$DATA" > /tmp/data.binSTART_TIME=$(date +%s%3N)./pkcs11-tool --module "$SOFTHSM_MODULE" --login --pin "$PIN" --read-object --type data --label "DataObject_1" > /dev/nullEND_TIME=$(date +%s%3N)DIFF=$((END_TIME - START_TIME))DIFF=$((END_TIME - START_TIME))if [ $DIFF -lt 0 ]; thenDIFF=$((START_TIME - END_TIME))fiecho "Execute Time: ${DIFF} ms"# 检查是否成功if [ $? -eq 0 ]; thenecho "read数据对象: ID=$ID, 标签=$LABEL"elseecho "read数据对象失败: ID=$ID, 标签=$LABEL"exit 1fi# 增加计数器COUNTER=$((COUNTER + 1))
doneecho "已完成read $MAX_COUNT 个数据对象。"
读安全数据的性能(基于以上已有的196MB的数据库,读取小的数据块,128-256Bytes):
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x47b89b8b)
e4d4dac6f0903e57f7cf925cbb8ad5980452e60358311ac1b139b880d16ba8a96f65dce59ec21cab8658daf567374e10302815253998afe3c606e3c41decc7d6dc4008030dfa15c1d1e356443c43166d17a280ad1e4324d203b0f893f634750838a79cec18bf88bc9ec87867d86bf67a7d8c9d36a223839bbbb92704acd558ee
Execute Time: 1067 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x47b89b8b)
e4d4dac6f0903e57f7cf925cbb8ad5980452e60358311ac1b139b880d16ba8a96f65dce59ec21cab8658daf567374e10302815253998afe3c606e3c41decc7d6dc4008030dfa15c1d1e356443c43166d17a280ad1e4324d203b0f893f634750838a79cec18bf88bc9ec87867d86bf67a7d8c9d36a223839bbbb92704acd558ee
Execute Time: 1064 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x47b89b8b)
e4d4dac6f0903e57f7cf925cbb8ad5980452e60358311ac1b139b880d16ba8a96f65dce59ec21cab8658daf567374e10302815253998afe3c606e3c41decc7d6dc4008030dfa15c1d1e356443c43166d17a280ad1e4324d203b0f893f634750838a79cec18bf88bc9ec87867d86bf67a7d8c9d36a223839bbbb92704acd558ee
Execute Time: 1061 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
结论:Softhsm使用数据库SQLite3存储数据对象的性能与sqlite3.db数据库的大小成反比,与数据条目数量不敏感,不符合数据库插入数据时间相对恒定的规律。
测试环境二:使用本地文件存储形式
option(WITH_OBJECTSTORE_BACKEND_DB "Build with object store backend database (SQLite3)" ON)
option(WITH_MIGRATE "Build migration tool. Requires SQLit3." ON)
set(DEFAULT_OBJECTSTORE_BACKEND "file" CACHE STRING "Default storage backend for token objects")
directories.tokendir = @softhsmtokendir@
objectstore.backend = file
objectstore.umask = 0077
测试性能(构造10MB数据块,连续存入20次,性能衰减不明显):
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_SMALL_1;type=data
Execute Time: 47 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_SMALL_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_SMALL_2;type=data
Execute Time: 66 ms
已写入数据对象: ID=0002, 标签=DataObject_2
...
...
...
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_SMALL_19'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_SMALL_19;type=data
Execute Time: 158 ms
已写入数据对象: ID=0013, 标签=DataObject_19
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_SMALL_20'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_SMALL_20;type=data
Execute Time: 188 ms
已写入数据对象: ID=0014, 标签=DataObject_20
已完成写入 20 个数据对象。
前置条件:构造10MB数据块,连续存入20次,在token目录下获得20个数据块文件
测试性能(数据块大小256Bytes,存入3次,性能衰减不明显,存入时间>=历史存入时间):
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_1;type=data
Execute Time: 145 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_2;type=data
Execute Time: 143 ms
已写入数据对象: ID=0002, 标签=DataObject_2
Using slot 0 with a present token (0x3bacd06c)
Created Data Object:
Data object 2label: 'DataObject_3'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=f0691d4b3bacd06c;token=FileToken;object=DataObject_3;type=data
Execute Time: 148 ms
已写入数据对象: ID=0003, 标签=DataObject_3
已完成写入 3 个数据对象。
测试性能(读一块数据,块大小5MBytes,读取性能良好):
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x2ed47981)
Execute Time: 146 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x2ed47981)
Execute Time: 145 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$
测试性能(清零token,块大小256Bytes,连续存入1000次,存入性能良好):
Using slot 0 with a present token (0x37a524)
Created Data Object:
Data object 2label: 'DataObject_1'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=70e3fbdc8037a524;token=FileToken;object=DataObject_1;type=data
Execute Time: 7 ms
已写入数据对象: ID=0001, 标签=DataObject_1
Using slot 0 with a present token (0x37a524)
Created Data Object:
Data object 2label: 'DataObject_2'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=70e3fbdc8037a524;token=FileToken;object=DataObject_2;type=data
Execute Time: 7 ms
已写入数据对象: ID=0002, 标签=DataObject_2
...
...
...
Using slot 0 with a present token (0x37a524)
Created Data Object:
Data object 2label: 'DataObject_999'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=70e3fbdc8037a524;token=FileToken;object=DataObject_999;type=data
Execute Time: 65 ms
已写入数据对象: ID=03e7, 标签=DataObject_999
Using slot 0 with a present token (0x37a524)
Created Data Object:
Data object 2label: 'DataObject_1000'application: ''app_id: <empty>flags: modifiableuri: pkcs11:model=SoftHSM%20v2;manufacturer=SoftHSM%20project;serial=70e3fbdc8037a524;token=FileToken;object=DataObject_1000;type=data
Execute Time: 70 ms
已写入数据对象: ID=03e8, 标签=DataObject_1000
已完成写入 1000 个数据对象。
测试性能(读一块数据大小256Bytes,读取性能不好):
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x37a524)
Execute Time: 2472 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$ ./read_objects.sh
Using slot 0 with a present token (0x37a524)
515ed5b327f7468aece868f8db398dc0607ed2d466adfdac066965e0b4bc6ab2210273e0fb4bdc380eb5d0c13d705815f7e5640952ef305b5228adb71077ba5bba576e6cc0b671e14fca598bc9a0bed0f817d66f0d7ee20cb07a2a2b66df7455b473c364621ebc89078563d88661b085bf853f623fefa2ed16088a30ddd1714a
Execute Time: 2440 ms
read数据对象: ID=, 标签=
已完成read 1 个数据对象。
ubuntu@ubuntu-vm:~/Documents/HSM/20250106/OpenSC/out/bin$
结论:Softhsm使用本地文件系统存储数据对象的写入性能较数据库有明显优势,读本地数据的性能和数据条目数量相关性强,条目数量大时读性能差。
相关文章:
Softhsm储存安全数据性能整理
目标:存储百万条数据对象 测试方案一:总大小2GB,每个数据对象大小约512KB,总条数4096条; 测试方案一:总大小2GB,每个数据对象大小约256B,总条数8388608条; 测试环境&am…...
KaiOS 4.0 APN List 界面加载debug
问题背景 在列表选中APN进入编辑后,退出返回列表界面时无法焦点选中编辑的APN。 代码分析 路径:gaia/apps/settings/js/panels/apn_list/panel.js 分析SettingsPanel界面加载的步骤逻辑 onBeforeShow -> onShow -> onBeforeHide -> onHide return SettingsPanel(…...
Next.js 15【实用教程】2025最新版
官网 https://nextjs.org/docs/app/getting-started Next.js 简介 Next.js 由 Vercel 开发和维护,旨在解决单页应用(SPA)和多页应用(MPA)在性能和 SEO 上的不足。 核心特性 服务端渲染(SSR)--…...
2025-02-13 学习记录--C/C++-PTA 7-17 爬动的蠕虫
一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h>int main() {int N, U, D; // N: 井的总高度,U: 每分钟向上爬的高度,D: 每分钟滑下的高度int height 0; // 蠕虫当前的高度int minute 0; // 蠕虫爬行的时间sc…...
Elasticsearch+Logstash+Kibana可视化集群部署
文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch:开源实时分布式搜索和分析引擎,支持大规模数据存储和高吞吐量,提供丰富的搜索功能和可扩展性。 Logsta…...
React VS Vue
React 和 Vue 是目前最流行的两个前端框架,它们在设计理念、生态系统和开发体验上各有特点。以下是对 React 和 Vue 的全方位对比: 1. 核心设计理念 React 库而非框架:React 是一个用于构建 UI 的库,专注于视图层,其…...
DeepSeek+Excel 效率翻倍
2025年初,DeepSeek以惊人的效率突破技术壁垒,用极低的成本实现了与行业顶尖AI相媲美的性能,瞬间成为全球科技领域的热门话题。 那么AI工具的普及将如何改变我们的工作方式?Excel会被取代吗? 今天,珠珠带你…...
将Sqlite3数据库挂在内存上处理
创作灵感:最近把小学生的口算题从2位数改到3位数,100以内四则运算练习(千纬数学)再次更新,选取难题-CSDN博客要不断刷题目,以前100以内的加减乘除也是这样刷出来的,代码如下: impor…...
Vue3.5 企业级管理系统实战(六):Vue3中defineProps用法
上一节封装图标组件 SvgIcon 时,用到了 defineProps,因为它在开发中的重要性,这里简单看一下它的用法,已熟知用法的此节可跳过。 在 Vue3 的组件化开发体系里,组件间通信是构建高效、可维护应用程序的核心环节。defin…...
HTTP/2 由来及特性
HTTP/2 的由来 HTTP/1.x 的局限性 性能瓶颈 队头阻塞问题:在HTTP/1.x中,一个TCP连接在同一时间只能处理一个请求,后续请求必须等待前面的请求处理完成并收到响应后才能被处理。例如,当一个页面有多个资源(如图片、脚…...
electron.vite 项目创建以及better-sqlite3数据库使用
1.安装electron.vite npm create quick-start/electronlatest中文官网:https://cn.electron-vite.org/ 2. 安装项目依赖 npm i3.修改 electron-builder 配置文件 appId: com.electron.app productName: text33 directories:buildResources: build files:- !**/.v…...
蓝桥杯 Java B 组之枚举算法(暴力破解)
Day 3:枚举算法(暴力破解) 枚举算法(Brute Force)是一种 暴力搜索 方法,它通过 遍历所有可能的情况 来找到正确答案。虽然它的 时间复杂度较高,但在 数据范围较小 时,它是一种简单且…...
AI 控制web浏览器基础知识准备,名词解释Xvfb,x11vnc,novnc,playwright,gradio
在探索如何让AI控制Web浏览器实现自动化任务时,了解底层技术栈是关键。本文将解析五个核心组件:Xvfb、x11vnc、novnc、playwright和gradio,这些工具共同构成了AI驱动浏览器的基础架构。 1. Xvfb(X Virtual Framebuffer࿰…...
C++,STL容器适配器,stack:栈深入解析
文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 容器适配器设计2. 默认容器对比三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义栈实现四、实战应用场景1. 括号匹配校验2. 浏览器历史记录管理五、性能优化策略1. 底层容器选择基准2. 内存预分配技巧六…...
Vue笔记(十)
一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件,基于大量代码训练,能根据上下文自动生成代码建议。 2.安装与配置:在常用代码编辑器(如Visual Studio Cod…...
Ubuntu下载安装Docker-Desktop
下载 Ubuntu | Docker Docs 预备工作 Ubuntu增加docker apt库-CSDN博客 安装 sudo apt-get updatesudo apt install gnome-terminal# sudo apt install -y docker-composesudo apt-get install ./docker-desktop-amd64.deb 测试 sudo docker run hello-worldHello from D…...
DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…...
C#运动控制——轴IO映射
1、IO映射的作用 该功能允许用户对专用 IO 信号的硬件输入接口进行任意配置,比如轴的急停信号,通过映射以后,可以将所有轴的急停信号映射到某一个IO输入口上,这样,我们只要让一个IO信号有效就可以触发所有轴的急停。 进…...
ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet
集合族谱 在这些集合中,仅有vector和hashtable是线程安全的,其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现,实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 A…...
DeepSeek 指导手册(入门到精通)
第⼀章:准备篇(三分钟上手)1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章:基础对话篇(像交朋友⼀样学交流)2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章:效率飞跃篇&…...
window 11 鼠标右键切换回经典模式
window 11 鼠标右键切换回经典模式 在换新电脑,更新到 window 11 后,鼠标右键很不习惯,把很多功能都隐藏到最后一个打开更多模块了,删除以及刷新等操作也不能使用右键字母快捷操作。 恢复window 11 右键菜单到经典模式 方法一&am…...
RabbitMQ 延迟队列
1.延迟队列插件安装(版本号要对其) Releases rabbitmq/rabbitmq-delayed-message-exchange GitHub 下载的文件: rabbitmq_delayed_message_exchange-3.13.0.ez 直接复制到以下文件夹: \RabbitMQ Server\rabbitmq_server-3.13.7\plugins\ 执行命令…...
Unity3D 类MOBA角色控制器 开箱即用
Github: Unity3D-MOBA-Character-Controller 觉得好用麻烦点个Star感谢!...
认识一下redis的分布式锁
Redis的分布式锁是一种通过Redis实现的分布式锁机制,用于在分布式系统中确保同一时刻只有一个客户端可以访问某个资源。它通常用于防止多个应用实例在同一时间执行某些特定操作,避免数据的不一致性或竞争条件。 实现分布式锁的基本思路: 1. …...
【CXX】0 Rust与C ++的互操作利器:CXX库介绍与示例
CXX库是一个非常强大的工具,它使得Rust和C之间的互操作性变得既安全又高效。本专栏将展示如何使用CXX库来桥接Rust和C代码,同时保持两者语言的特性和惯用法。 一、关键概念 类型安全:CXX库通过静态分析类型和函数签名来保护Rust和C的不变量…...
2024 CyberHost 语音+图像-视频
项目:CyberHost: Taming Audio-driven Avatar Diffusion Model with Region Codebook Attention 音频驱动的身体动画面临两个主要挑战:(1)关键人体部位,如面部和手部,在视频帧中所占比例较小&#x…...
企业文件安全:零信任架构下的文件访问控制
在企业数字化转型的进程中,传统的文件访问控制模型已难以满足日益复杂的网络安全需求。零信任架构作为一种新兴的安全理念,为企业的文件安全访问提供了全新的解决方案。 一、传统文件访问控制的局限性 传统的文件访问控制主要基于网络边界,…...
Rasa学习笔记
一、CALM 三个关键要素: 业务逻辑:Flow,描述了AI助手可以处理的业务流程对话理解:旨在解释最终用户与助手沟通的内容。此过程涉及生成反映用户意图的命令,与业务逻辑和正在进行的对话的上下文保持一致。自动对话修复…...
list_for_each_entry_safe 简介
list_for_each_entry_safe 是 Linux 内核中用于遍历链表的一个宏,特别适用于在遍历过程中可能需要删除链表节点的场景。它的设计保证了在删除当前节点时,不会影响后续节点的访问,从而实现安全的遍历。 定义 #define list_for_each_entry_sa…...
Android 系统面试问题
一.android gki和非gki的区别 Android GKI(Generic Kernel Image)和非GKI内核的主要区别在于内核设计和模块化程度,具体如下: 1. 内核设计 GKI:采用通用内核设计,与设备硬件分离,核心功能统一…...
