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…...
【C++】——精细化哈希表架构:理论与实践的综合分析
先找出你的能力在哪里,然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表:核心概念与引入 2. 哈希表的底层机制:原理与挑战 2.1 核心功能解析:效率与灵活性的平衡 2.2 哈希冲突的本质&#x…...
【cocos creator】拖拽排序列表
DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…...
b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)
问题陈述 我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布: 左边的老虎机:奖励服从均值为 500,标准差为 50 的正态分布,即…...
【Mac排错】ls: command not found 终端命令失效的解决办法
【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal,并且为她定制了不同的Profile。 这样,看起来她可以在不同季节&…...
探秘Hugging Face与DeepSeek:AI开源世界的闪耀双子星
目录 一、引言:AI 开源浪潮的澎湃二、Hugging Face:AI 开源社区的基石(一)起源与发展历程(二)核心技术与特色(三)在 AI 领域的广泛应用 三、DeepSeek:东方崛起的 AI 新势…...
SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中,我们通过进程监控和日志分析来发现系统问题&…...
本地部署DeepSeek-R1(Mac版)
本地部署DeepSeek-R1(Mac版) 前言:过年这段时间,DeepSeek火遍全球,但遭受黑客攻击,10次对话基本9次都是服务器繁忙,请稍后重试。那么,本地部署整起来 总体来说,本地部署…...
网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级
今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…...
apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片
概述 业务中经常会遇到在单元格内填充图片的需求,而且要求指定图片在单元格内的位置。 一般都是用的apache的poi,设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…...
Java、Go、Rust、Node.js 的内存占比及优缺点分析
在选择编程语言进行项目开发时,内存占用是一个重要的考量因素。不同语言在内存管理、垃圾回收、并发模型等方面各有特点,影响着它们的内存使用情况。本文将对 Java、Go、Rust 和 Node.js 的内存占比进行对比,并分析它们的优缺点。 1. Java 的…...
C++智能指针的使用
文章目录 智能指针的使用和原理智能指针的使用场景RAII和智能指针C标准库智能指针的使用 智能指针的使用和原理 智能指针的使用场景 1. 下面的程序中,new了以后,我们也delete了,但是因为抛异常导致后面的delete没有得到执行,所以…...
计算机毕业设计——Springboot的社区维修平台旅游管理
📘 博主小档案: 花花,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 花花在深度学习任务中展现出卓越的能力,包括但不限于java、python等技术。近年来,花花更…...
MySQL ALTER 命令详解
MySQL ALTER 命令详解 引言 MySQL 是一款广泛使用的开源关系数据库管理系统,ALTER 命令在 MySQL 数据库管理中扮演着至关重要的角色。ALTER 命令用于修改现有的数据库、表或列的定义。本文将详细介绍 MySQL ALTER 命令的用法、功能及其在实际应用中的重要性。 ALTER 命令概…...
02、QLExpress从入门到放弃,相关API和文档
QLExpress从入门到放弃,相关API和文档 一、属性开关 public class ExpressRunner {private boolean isTrace;private boolean isShortCircuit;private boolean isPrecise; }/*** 是否需要高精度计算*/ private boolean isPrecise false;高精度计算在会计财务中非常重要&…...
Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)
背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...
deepseek大模型集成到idea
1 下载插件 安装CodeGPT打开 IntelliJ IDEA,鼠标点击左上角导航栏,File --> Setting 2 申请API key 3 配置deepseek 在 Settings 界面中的搜索框中,搜索 CodeGPT,路径 Tools --> CodeGPT --> Providers --> 如下一…...
AI基础 -- AI学习路径图
人工智能从数学到大语言模型构建教程 第一部分:AI 基础与数学准备 1. 绪论:人工智能的过去、现在与未来 人工智能的定义与发展简史从符号主义到统计学习、再到深度学习与大模型的变迁本书内容概览与学习路径指引 2. 线性代数与矩阵运算 向量与矩阵的…...
在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码
最近在尝试将一些 C/C、Lua 项目挪到 Web 上跑, 接触到了 emscripten. 这里会介绍下在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码 (WebAssembly) 的一些方法. Emscripten 与 WebAssebmly WebAssembly 是一种新的编码方式, 可以在现代…...
elasticsearch实战应用从入门到高效使用java集成es快速上手
Elasticsearch 因其出色的性能、可扩展性和易用性,成为了处理大规模数据和构建搜索引擎的首选工具。本文将通过一个实际案例,详细讲解如何在 Spring Boot 项目中集成 Elasticsearch,进行数据索引、搜索、聚合分析等操作。 一、Elasticsearch 简介 Elasticsearch 是一个基于…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
