HASH256开源代码计算错误问题
计算量超500KB报错
OTA升级中可能会涉及到CRC、hash校验等算法,小编从网上抄到了HASH256的源码,拿来使用的时候却发现了一个问题,当源文件约大于500KB的时候会发现其计算出的hash值出现错误。
经过实际测试得知,当源文件大于约500kb时,用开源代码计算的hash值存在概率不正确的情况,而且发现其源文件大小/8byte为整数时计算出的结果是正确的(如下图计算出来的就是错误的)。
本着快速解决项目问题的想法,想到了将源文件大小补齐/8byte为整数的操作。(实际是小编暂时没能力找到问题所在哈哈哈)
若大家有更好的解决办法请指出~
代码片(.C)
/** @Description: * @Author: shimianxiang* @Date: 2023-10-11 08:27:06* @LastEditTime: 2023-10-25 11:28:06* @LastEditors: shimianxiang*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "mcuhash2.h"
#include<time.h>
#include <math.h>uint32_t TW[16];
uint8_t bitbuff[512/8];
uint32_t bitbuff_num=0;uint32_t fill_data[64]={ 0x80000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000,0x00000000, 0x00000000, 0x00000000, 0x00000000 };uint32_t data[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
/*-----------------------------------------------------------------------SHA-256-------------------------------------------------------*/
uint32_t Ch(uint32_t x, uint32_t y, uint32_t z)
{return (x & y) ^ (~x & z);
}
uint32_t cycle_rshift(uint32_t x,uint32_t n)
{return ((x & (((uint32_t)1 << n) - 1)) << (32 - n))|(x >> n);
}
uint32_t Sum0(uint32_t x)
{return cycle_rshift(x, 2) ^ cycle_rshift(x, 13) ^ cycle_rshift(x, 22);
}
uint32_t Sum1(uint32_t x)
{return cycle_rshift(x, 6) ^ cycle_rshift(x, 11) ^ cycle_rshift(x, 25);
}
uint32_t Sigma0(uint32_t x)
{return cycle_rshift(x, 7) ^ cycle_rshift(x, 18) ^ (x>>3);
}
uint32_t Sigma1(uint32_t x)
{return cycle_rshift(x, 17) ^ cycle_rshift(x, 19) ^ (x >> 10);
}
uint32_t Ma(uint32_t x, uint32_t y, uint32_t z)
{return (x & y) ^ (x & z)^ (y & z);
}
void sha_init(struct sha256 *s)
{s->hash[0] = H0;s->hash[1] = H1;s->hash[2] = H2;s->hash[3] = H3;s->hash[4] = H4;s->hash[5] = H5;s->hash[6] = H6;s->hash[7] = H7;s->hash_length = 0;s->index = 0;s->offset = 0;
}void sha_caculator(struct sha256* s)//先补齐 Wt,然后循环64次加密
{uint8_t i = 0;uint32_t m0, s0, s1,c1,t1;uint32_t temp[8];for(i=0;i<8;i++)temp[i]=s->hash[i];for (i = 0; i < 16; i++)Wt[i] = s->block[i];for (i = 16; i < 64; i++)Wt[i] = Sigma1(Wt[i-2])+ Wt[i-7]+Sigma0(Wt[i - 15])+ Wt[i - 16];for (i = 0; i < 64; i++){s0 = Sum0(temp[0]);s1 = Sum1(temp[4]);m0 = Ma(temp[0], temp[1], temp[2]);c1 = Ch(temp[4], temp[5], temp[6]);t1 = s1+c1+temp[7]+Wt[i] + Kt[i];temp[7] = temp[6];temp[6] = temp[5];temp[5] = temp[4];temp[4] = temp[3]+ t1;temp[3] = temp[2];temp[2] = temp[1];temp[1] = temp[0];temp[0] = t1+m0+s0;}for (i = 0; i < 8; i++)s->hash[i]+=temp[i];
}void sha_updata(struct sha256* s,unsigned char *str,uint64_t len)
{uint64_t i = 0;uint64_t count;s->hash_length += len;if (s->offset!=0)//说明没有4字节对齐{if (s->offset + len < 4){for (i = s->offset; i < s->offset+len; i++){s->block[s->index] |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}s->offset += len;return;}else{len = len + s->offset - 4;for (i = s->offset; i < 4; i++){s->block[s->index] |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}s->index++;if (s->index == 16){sha_caculator(s);//满足512bit 16Word加密一次s->index = 0;}}}count = (len >> 2);//计算这次加密有多少个Words->offset = len % 4;//对齐Word剩余的bytefor(i=0;i<count;i++){s->block[s->index] = (((uint32_t)(*str)) << 24) |((*(str + 1)) << 16) |((*(str + 2)) << 8) |(*(str + 3));s->index++;str += 4;if (s->index == 16){sha_caculator(s);//满足512bit 16Word加密一次s->index = 0;}}s->block[s->index] = 0;//对齐Word剩余的byte写在 s->index 位置上,供下一次update使用for (i = 0; i < s->offset; i++){s->block[s->index] |= (((uint32_t)(*str)) << (8 * (3 - i)));str++;}}void sha_final(struct sha256* s)
{uint8_t temp=s->hash_length % 64;//计算需要填充多少byteuint8_t fill[4] = { 0x80,0x0,0x0,0x0 };uint32_t i;if (temp == 56)//则需要填充一个512bit{//补齐前一次的512bitif (s->offset != 0){for (i = 0; i < 4-s->offset; i++)s->block[s->index] |= (fill[i]<< (8 * (3 - i-s->offset)));s->index++;}else{s->block[s->index] = 0x80000000;s->index++;}for (i = s->index; i < 16; i++)s->block[i] = 0;sha_caculator(s);for(i=0;i<14;i++)s->block[i] = 0;s->block[14] = s->hash_length >> 29;s->block[15] = s->hash_length << 3 & 0xffffffff;sha_caculator(s);}else{if (s->offset != 0){for (i = 0; i < 4-s->offset; i++)s->block[s->index] |= (fill[i] << (8 * ( 3 - i - s->offset)));s->index++;}else{s->block[s->index] = 0x80000000;s->index++;}for (i = s->index; i < 14; i++)s->block[i] = 0;s->block[14] = s->hash_length>> 29;s->block[15] = s->hash_length<<3 & 0xffffffff;sha_caculator(s);}
}
/*-----------------------------------------------------------------------sort-------------------------------------------------------*/
uint32_t FlashASH_256(uint8_t *outdata,uint8_t *data,uint32_t length)
{uint32_t bitnum = (length+bitbuff_num) % 64;uint32_t hash_times = (length+bitbuff_num)/64;uint32_t offset_num = 0;uint32_t bitbuff_num_or = 0;while (hash_times){if(bitbuff_num == 0){memcpy(&outdata[0],&data[0]+64*offset_num+bitbuff_num_or,64);hash_times--;offset_num++;// for(int i=0;i<4;i++)// {// printf("%x %x %x %x ",TW[i*4+0],TW[i*4+1],TW[i*4+2],TW[i*4+3]);// }// printf("\n-----------------\n");}else{bitbuff_num_or = 64-bitbuff_num;memcpy(&outdata[0],&bitbuff[0],bitbuff_num);memcpy(&outdata[0]+bitbuff_num,&data[0]+64*offset_num,bitbuff_num_or);// memcpy(&outdata[0]+1,&data[0]+64*offset_num,bitbuff_num_or);hash_times--;bitbuff_num = 0;// for(int i=0;i<4;i++)// {// printf("%x %x %x %x ",TW[i*4+0],TW[i*4+1],TW[i*4+2],TW[i*4+3]);// }// printf("\n+----------------\n");}}if(bitnum != 0){memcpy(&bitbuff[0]+bitbuff_num,&data[0]+64*offset_num+bitbuff_num_or,bitnum);bitbuff_num = bitnum;// printf("\n get %d\n",bitnum);bitnum = 0;}else{bitbuff_num = 0;}return bitbuff_num;
}int main(int argc, char const *argv[])
{printf("start \n");#if 0for(int i=1;i<16;i++){TW[i]=0xffffffff+i;}uint8_t* inaddr_end=&fill_data[0];uint8_t* inaddr=&data[0];// memcpy(&TW[0],&Kt[0],65);FlashASH_256(&TW[0],&inaddr[0],120);FlashASH_256(&TW[0],&inaddr[120],1);FlashASH_256(&TW[0],&inaddr[121],4);FlashASH_256(&TW[0],&inaddr[125],35);uint32_t num=FlashASH_256(&TW[0],&inaddr[160],36);// FlashASH_256(&Kt[0]+129,63);FlashASH_256(&TW[0],&inaddr_end[0],(uint32_t)64-num);printf("last_num= %d\n",num);#elif 0FILE *fp = fopen("./tesths.c", "rb");if(fp == NULL){printf("can not open file\n");return -1;}fseek(fp, 0, SEEK_END);uint32_t size = ftell(fp);char encrypt[1024*1024];fseek(fp, 0, SEEK_SET);printf("\n size: %d \n",size);int len = fread(encrypt, sizeof(char), size, fp);fclose(fp);struct sha256 testsha;// uint8_t* inaddr=&data[0];sha_init(&testsha);sha_updata(&testsha, &encrypt[0], size);sha_final(&testsha);for (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\n");/* 验证通过 */#elif 1clock_t start,end;
FILE *fp2 = fopen("./dest_hash.bin", "w");
if(fp2 == NULL)
{printf("can not mkdir file\n");return -1;
}
fclose(fp2);
FILE *fp3 = fopen("./dest_hash.bin", "rb+");FILE *fp = fopen("./source.bin", "rb+");if(fp == NULL){printf("can not open file\n");return -1;}fseek(fp, 0, SEEK_END);uint32_t size = ftell(fp);char encrypt[1024*1024];uint8_t* size_u8 = &size;/*如果源文件大小除8byte除不尽*/uint8_t buding=size%8;if(buding != 0){buding = 8 - buding;}fseek(fp, 0, SEEK_SET);printf("size of bin: %d &add length=%d\n",size,size + 32);int len = fread(encrypt, sizeof(char), size, fp);size = buding + size;struct sha256 testsha;// uint8_t* inaddr=&data[0];sha_init(&testsha);start=clock();sha_updata(&testsha, &encrypt[0], size);// sha_updata(&testsha, &encrypt[size/2], size/2);// sleep(2);sha_final(&testsha);end=clock();float time=(float)(end-start);printf("time=%lf ms\n",time);fseek(fp3, 0, SEEK_END);fwrite(encrypt, sizeof(char), size, fp3);
/* 文件结尾hash值输出开关 */
#if 1
/* 大小端切换开关 */
#if 0// fseek(fp3, size + 4, SEEK_SET);printf("write hash num byte=%d\nHASH:\n",fwrite(testsha.hash, sizeof(char), 32, fp3));fclose(fp);fclose(fp3);
#elseuint8_t* hashfinal = &testsha.hash[0];// fseek(fp, size, SEEK_SET);int i,k;for(i=0;i<8;i++)for(k=0;k<4;k++)fwrite(&hashfinal[i*4+(3-k)], sizeof(char), 1, fp3);printf("write hash num byte=32\nHASH:\n");#endiffclose(fp3);
#else
fwrite(encrypt, sizeof(char), size, fp3);fclose(fp);fclose(fp3);
#endiffor (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\nhash_finish!\n");// system("pause");/* 验证通过 */#elif 1struct sha256 testsha;uint8_t* inaddr_end=&fill_data[0];uint8_t* inaddr=&data[0];// memcpy(&TW[0],&Kt[0],65);sha_init(&testsha);// FlashASH_256(&testsha.block[0],&inaddr[0],14);uint32_t num=FlashASH_256(&testsha.block[0],&inaddr[0],14);// FlashASH_256(&Kt[0]+129,63);sha_caculator(&testsha);for (int i = 0; i < 8; i++)printf("%08x ", testsha.hash[i]);printf("\n");// FlashASH_256(&TW[0],&inaddr_end[0],(uint32_t)64-num);// printf("last_num= %d\n",num);#endifreturn 0;
}
代码片(.H)
/** @Description: * @Author: shimianxiang* @Date: 2023-10-11 09:27:35* @LastEditTime: 2023-10-12 13:33:24* @LastEditors: shimianxiang*/#ifndef HASHASH256_H_
#define HASHASH256_H_#define H0 0x6a09e667
#define H1 0xbb67ae85
#define H2 0x3c6ef372
#define H3 0xa54ff53a
#define H4 0x510e527f
#define H5 0x9b05688c
#define H6 0x1f83d9ab
#define H7 0x5be0cd19
uint32_t Wt[64];
uint32_t Kt[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
struct sha256
{uint32_t block[16]; //加密的measageuint32_t hash[8]; //hash的结果uint64_t hash_length;//总共hash的byte数uint8_t offset; //一个update未对齐Word(4字节)的字节数uint8_t index; //当前已经写到block的位置
};
#endif
相关文章:
HASH256开源代码计算错误问题
计算量超500KB报错 OTA升级中可能会涉及到CRC、hash校验等算法,小编从网上抄到了HASH256的源码,拿来使用的时候却发现了一个问题,当源文件约大于500KB的时候会发现其计算出的hash值出现错误。 经过实际测试得知,当源文件大于约50…...
对象流—ObjectInputStream 和 ObjectOutputStream
对象流(ObjectInputStream和ObjectOutputStream)是Java中用于读写对象的流,可以将对象直接写入到流中,或者从流中读取对象。 ObjectOutputStream将对象序列化为字节流,可以将对象写入文件或网络流中。ObjectInputStream则将字节流反序列化为…...
【Fargo】27:ffmpeg ffprobe 和python分析h264文件并绘制
从帧和包两个层面进行分析。帧级别分析 ffprobe 可以读取264文件信息 -Y9KP MINGW64 /d/XTRANS/thunderbolt/ayame/zhb-bifrost/player-only (main) $ ffprobe test.h264 ffprobe version N-116778-g7e4784e40c-20240827 Copyright (c) 2007-2024 the FFmpeg developersbuilt …...
Debezium Engine监听binlog实现缓存更新与业务解耦
飞书文档 解决缓存与数据源数据不一致的方案有很多, 各有优缺点; 1.0、旁路缓存策略, 直接同步更新 读取流程: 查询缓存。如果缓存命中,则直接返回结果。如果缓存未命中,则查询数据库。将数据库查询到的数据写入缓存,并设置一个…...
mysql_题库详解
1、如何创建和删除数据库? 1)创建数据库 CREATE DATABASE 数据库名; 2)删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别? 1)事务:MyISAM 不支持事务 InnoDB 支持 2)行锁/表锁&a…...
docker查询是否运行
您可以通过运行以下命令来检查Docker是否正在运行: docker info 或者: docker ps 如果Docker正在运行,docker info将显示Docker的详细信息,而docker ps将列出当前运行的容器。如果Docker没有运行,这些命令将会返回错误…...
【AI日记】24.11.29 kaggle 比赛 Titanic-2 | 鼓励自己
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容:学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster,学习机器学习课程备注:入门比赛有很多 notebook 适合我这种新手学习,尤其是那…...
SVG无功补偿装置MATLAB仿真模型
“电气仔推送”获得资料(专享优惠) 模型简介 SVG(又称ASVG 或STATCOM)是Static Var Generator 的缩写,叫做静止无功发生器。也是做无功补偿的,比SVC 更加先进。其基本原理是将自换相桥式电路通过电抗器或…...
2039:【例5.6】冒泡排序
【题目描述】 编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序) 【输入】 第一行,数的个数n; 第二行,n个非负整数。 【输出】 由大到小的n个非负整数,每个数占一行。 【输…...
yum源问题的解决方案
linux课堂作业 问题描述 yum 直接安装tree的问题截图 这个错误表明你的系统没有正确注册到 Red Hat Subscription Management(这个问题不用管),也没有配置有效的 YUM 软件仓库,因此无法安装或更新软件包。 解决方案(…...
一文解析Kettle开源ETL工具!
ETL(Extract, Transform, Load)工具是用于数据抽取、转换和加载的软件工具,用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么? Kettle 是一款开源的 ETL&#x…...
微积分复习笔记 Calculus Volume 2 - 3.1
The first 2 chapters of volume 2 are the same as those in volume 1. Started with Chapter 3. 3.1 Integration by Parts - Calculus Volume 2 | OpenStax...
linux环境搭建
1、**连接外网** ssh在192.168.4.x上运行sudo ip link set ens160 down ssh切换到192.168.3.x(外网ip),运行sudo ip route add default via 192.168.2.1 dev ens192 onlink //连接外网 使用完外网后 ssh在192.168.3.x上运行sudo ip link set ens160 up ssh在1…...
黑马程序员Java笔记整理(day05)
1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组,如: M…...
DM达梦管理工具拖出空白区块,无法关闭
1. 出现问题:DM达梦管理工具拖出空白区块,无法关闭。 2. 解决方法 新建查询页,把查询页拖到空白区块里,完全覆盖空白区块。之后空白区块会变成查询页,右上角会出现叉号,点击叉号关闭就行。 3. 后记 达梦…...
Linux系统 异常控制流
文章目录 前言异常1. **中断(interrupt)**2. **陷阱和系统调用(trap)**3. **故障(fault)**4. **终止(abort)** 进程与信号非本地跳转 前言 下面内容大部分来自《深入理解计算机系统…...
Linux环境下配置neo4j图数据库
1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装(jdk1.8不够用) 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…...
python打包深度学习虚拟环境
今天师兄让我把环境打包发给他,我才知道可以直接打包深度学习虚拟环境,这样另一个人就不用辛辛苦苦的去装环境了,我们都知道有些论文他需要的环境很难装上。比如装Apex,装 DCN,mmcv-full 我现在把3090机子上的ppft虚拟…...
关于IDE的相关知识之一【使用技巧】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide使用技巧的相关内容! 关于…...
Redis开发03:常见的Redis命令
1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…...
[OS] A4-前菜介绍
从你的描述来看,这段话是给你的一些 预备知识 和 mkfs工具的使用 提示,帮助你了解如何构建和管理文件系统,特别是关于 xv6 文件系统的一些基本操作。 我会通过比喻和通俗化的方式逐步解释: 预备知识:xv6 文件系统的基…...
2024农历年余下的数模比赛名单已出炉!
数学建模比赛季又来了!作为一名资深的数学建模辅导老师,我想对你们说:这不仅是挑战智商的时候,也是展现团队合作力、数据分析能力和逻辑思维的最佳舞台!💡 如果你是建模新手,或者想让自己的比赛…...
在开发环境中,前端(手机端),后端(电脑端),那么应该如何设置iisExpress
首先,要想手机端应用能成功请求后端,两个设备至少需在同一个局域网内,且IP地址互通; 因为ajax是http(s)://IP地址端口号的方式请求,但是iisExpress默认是localhost如何解决,并没有IP地址,所以手…...
2.安装docker、docker compose
1. 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm22. 设置阿里云docker-ce镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3. docker-ce 安装 yum install -y docker-ce4. docker-compo…...
windows中idea选择bash作为控制台指令集,但是系统环境变量未在其中生效处理
1. 引言 在windows系统中安装node 以及npm时配置其环境,使用window环境变量的配置方式在系统环境变量设置的地方设置了环境变量如下图1-1,设置后在idea中的控制台通过 echo $PATH 查看环境变量发先跟系统中配置的不一致,而且node -v npm -v指…...
如何通过 ADB 安装 xapk
Android开发这么久,今天发现还能这么操作!😂 记录通过ADB安装xapk、apks的两种方式: 1.ADB命令安装使用APK-Splits技术分包的应用程序 这位大佬的方式步骤较为繁琐,不过兼容性应该较好,亲测成功安装。 2.How to install xapk, apks, or multiple-apks via adb? 这个…...
Docker使用教程
Docker 是一个开源的容器化平台,用于开发、打包和分发应用程序。它允许将应用及其依赖环境打包成容器,从而实现跨平台的便捷部署。下面是一个简单的 Docker 使用教程,涵盖从安装到基本命令的使用。 1. 安装 Docker Windows / MacOS 访问 D…...
我的创作纪念日
一、机缘 成为创作者的初衷是从学习C/C语法与数据结构过程中获得的灵感。在日常学习和项目实践中,我发现这些知识既丰富又复杂,对初学者而言尤为困难。因此,我决定通过博客记录自己的学习过程、解决思路以及代码实现,帮助更多人在…...
软件质量保证——单元测试之白盒技术
笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt,仅供学习交流使用,谢谢。 程序图 程序图定义 程序图P(V,E),V是节点的集合(节点是程序中的语句或语句片段),E是有向边的集合…...
redis中的哨兵
redis中的哨兵 一、哨兵机制的概念二、redis哨兵的部署2.1 docker的安装2.2 编排redis主从节点2.3 配置哨兵节点 三、redis哨兵的选举机制3.1 redis-master宕机之后的情况3.2 重启redis-master后的情况 四、redis哨兵机制的原理4.1主观下线4.2客观下线4.3选举leader节点4.4选出…...
开源对象存储新选择:在Docker上部署MinIO并实现远程管理
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
15分钟做完一个小程序,腾讯这个工具有点东西
我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手ÿ…...
houdini肌肉刷pin点的方法
目标:产生gluetoanimation这个属性 主要节点:attribute paint(或者muscle paint) 步骤1: 导入肌肉资产 导入的是rest shape的肌肉 在有侧边栏可以打开display group and attribute list,方便查看group。不同的肌肉块按照muscl…...
Ubuntu20.04安装NVIDIA显卡驱动
Ubuntu20.04安装NVIDIA显卡驱动 参考资料:https://blog.csdn.net/weixin_39244242/article/details/136282614?fromshareblogdetail&sharetypeblogdetail&sharerId136282614&sharereferPC&sharesourceqq_37397652&sharefromfrom_link 成功配置…...
k8s删除网络组件错误
k8s集群删除calico网络组件重新部署flannel网络组件,再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后,网…...
民锋视角:多元化策略实现资产稳健增长
在全球化经济的推动下,市场呈现出高度的复杂性与多样性。面对不同经济周期和市场动态,民锋以多元化投资策略为核心,帮助投资者在不确定性中实现资产的稳健增长。 一、多元化策略的核心价值 降低单一市场风险 单一资产或市场的表现可能因不可…...
[已解决]Visual Studio 2022中如何同时打开多个项目多个独立窗口
同时运行两个VS2022程序,即点击运行Visual Studio 2022.exe后,再点击运行一次运行Visual Studio 2022.exe,效果如图...
11、PyTorch中如何进行向量微分、矩阵微分与计算雅克比行列式
文章目录 1. Jacobian matrix2. python 代码 1. Jacobian matrix 计算 f ( x ) [ f 1 x 1 2 2 x 2 f 2 3 x 1 4 x 2 2 ] , J [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ] [ 2 x 1 2 3 8 x 2 ] \begin{equation} f(x)\begin{bmatrix} f_1x_1^22x_2\\…...
51c自动驾驶~合集35
我自己的原文哦~ https://blog.51cto.com/whaosoft/12206500 #纯视觉方案的智驾在大雾天还能用吗? 碰上大雾天气,纯视觉方案是如何识别车辆和障碍物的呢? 如果真的是纯纯的,特头铁的那种纯视觉方案的话。 可以简单粗暴的理解为…...
位图和布隆过滤器
目录 一.位图 1.位图的概念 2.位图的实现 3.位图的应用 二.布隆过滤器 1.布隆过滤器的概念 2.布隆过滤器的实现 3.布隆过滤器的优缺点 三.整体代码 1.bitset.h 2.BloomFilter 3.Hash.cpp 一.位图 1.位图的概念 1.面试题 给40亿个不重复的无符号整数,没…...
Java—I/O流
Java的I/O流(输入/输出流)是用于在程序和外部资源(如文件、网络连接等)之间进行数据交换的机制。通过I/O流,可以实现从外部资源读取数据(输入流)或将数据写入外部资源(输出流&#x…...
CSS样式
第一章:CSS类型 1、行内样式 <div style"color:red;font-size:30px;font-weight: 900;font-style: italic;">ABCD</div>注意:行内样式,作用力优先级最高,但是不利于html与css的书写以及修改,会…...
idea_卸载与安装
卸载与安装 卸载1、设置 -> 应用2、查找到应用,点击卸载3、把删除记录和设置都勾选上4、删除其它几个位置的残留 安装1、下载安装包2、欢迎安装 -> Next3、选择安装目录 -> Next4、创建快捷图标和添加到环境变量5、确认文件夹的名称 -> Install6、完成安…...
大数据-237 离线数仓 - 广告业务 需求分析 ODS DWD UDF JSON 串解析
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
视觉语言模型(VLM)学习笔记
目录 应用场景举例 VLM 的总体架构包括: 深度解析:图像编码器的实现 图像编码器:视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑:你输入 “生成一张…...
Spring 自调用事务失效分析及解决办法
前言 博主在写公司需求的时候,有一个操作涉及到多次对数据库数据的修改。当时就想着要加 Transactional注解来声名事务。并且由于一个方法中有太多行了,于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候,IDEA 提示我自调用…...
【ROS2】Ubuntu22.04安装ROS humble
一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。ROS的核心思想就是将机器人的软件功能做…...
免费开源的微信开发框架
请求参数 Header 参数 export interface ApifoxModel {"X-GEWE-TOKEN": string;[property: string]: any; } Body 参数application/json export interface ApifoxModel {/*** 设备ID*/appId: string;/*** 是否允许*/enabled: boolean;[property: string]: any; }…...
【第二讲】Spring Boot 3.4.0 新特性详解:新的依赖管理功能
Spring Boot 3.4.0 版本引入了一些显著的改进,其中之一就是新的依赖管理功能。这些改进不仅提升了依赖管理的便利性和一致性,还增强了项目的可维护性和可扩展性。本文将详细介绍 Spring Boot 3.4.0 中新的依赖管理功能,提供具体的使用示例和场…...
CSAPP Cache Lab(缓存模拟器)
前言 理解高速缓存对 C 程序性能的影响,通过两部分实验达成:编写高速缓存模拟器;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么,慢慢看官方文档,以及一些博客,和B站视频&…...