近期开发代码, 出现了一些诡异现象。追查原因是公司使用的签名函数出现的问题。

问题: 代码使用的签名库函数, 对于<=4字节的字符串, 签名就是本身。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h> int main(){
char str[] = "ni"; //长度是2
unsigned num[]; //长度是4
memset(num, , sizeof(unsigned));
memcpy(num, str, strlen(str)); //num[0] = 26990 //可以看出, str, num 在前3个字节的内存是相等的
printf("tag = %d\n", memcmp(num, str, strlen(str) + )); //把\0也算进去 //对于使用的优化后的签名函数, <= 4个字节则签名为本身(12的签名还是12)
//出现的bug是:
//str:ni, len:3 ---> sign:26990
//num:26990, len:4 ---> sign:26990
return ;
}

hash函数只是计算签名, 有时会有hash冲突导致实际不相等的字符串, 有相同的hash值。

如果要严格比较, 可以直接比较内存字节。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h> int is_eq(
const void* addr1, int len1,
const void* addr2, int len2){
if (len1 != len2){
return ;
}
return memcmp(addr1, addr2, len1) == ? :;
} int main(){
char str[] = "ni"; //长度是2
unsigned num[]; //长度是4
num[] = ; //把字符串的结尾也计算进去
printf("tag = %d\n", is_eq(str, strlen(str) + , num, sizeof(num)));
return ;
}

在严格场景下, 可以先用hash做签名, 之后再具体到每个hash值(桶, 拉链)上进行内存字节的比较就可以解决。

一次问题追查----短字符串签名算法引发的bug的更多相关文章

  1. 字符串拼接引发的BUG

    译者按: bug虽小,却是个磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn into numbers in JavaScript 译者 ...

  2. 使用List把一个长字符串分解成若干个短字符串

    把一个长字符串分解成若干个固定长度的短字符串,由于事先不知道长字符串的长度,以及短字符串的数量,只能使用List. public static void get_list_sbody(String s ...

  3. TSQL:判断某较短字符串在较长字符串中出现的次数。

    给定一个较短字符串shortStr='ab',和一个较长字符串longStr='adkdabkwelabwkereabrsdweo2342ablk234lksdfsdf1abe': 判断shortSt ...

  4. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  5. 安卓微信overflow-x overflow-y引发的bug

    今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...

  6. QByteArray引发的bug

    QByteArray引发的bug 在接收UDP数据的函数里,有如下代码片段 if(0x10 == data.size() && 0xCA == (unsigned char)data. ...

  7. .NET跨平台之旅:数据库连接字符串写法引发的问题

    最近在一个ASP.NET Core站点中遇到一个奇怪问题.当用dotnet run命令启动站点后,开始的一段时间请求执行速度超慢,有时要超过20秒,有时甚至超过1分钟,日志中会记录这样的错误: Sys ...

  8. java的长字符串转化为短字符串

    public class CustomEncrypt{ public static void main( String[] args ) { /* * c#给的正确测试用例: id=>mid * ...

  9. [小米OJ] 11. 构建短字符串

    思路 排序后对两个字符串遍历 function solution(line) { var str = line.split(" "); var str1 = str[0].spli ...

随机推荐

  1. jstat命令总结

    jvm统计信息监控工具 一. jstat是什么 jstat是JDK自带的一个轻量级小工具.全称"Java Virtual Machine statistics monitoring tool ...

  2. Xamarin 2017.11.9更新

     Xamarin 2017.11.9更新 本次更新主要针对Xamarin.iOS,适配了iOS 11.1和Xcode 9.1.Visual Studio 2017升级到15.4.3获得新功能.Visu ...

  3. ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge

    ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge Arduino环境与Linux环境的桥梁——Bridge 在第一章中介绍Arduino Yun硬件的时候提到过,它上面有 ...

  4. db 文件 查看 打开 工具 db 中文 版 navicat 中文

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha ======= db 中文 版 navicat 中文 ======= Navicatfo ...

  5. NCTF2018 Easy_Audit的writeup

    题目直接给出来代码 这题考几个点: 1.$_REQUEST的变量覆盖 2.编码绕过 3.PHP数组特性 4.正则绕过 5.file_get_contents函数 首先一步步把题目分析一遍 if($_R ...

  6. poj 1797 最短路变形dijkstra

    题意:题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 链接:点我 解题思路:其实这个求最大边可以近似于 ...

  7. 刚刚看到 PNaCl, 这才是我一直期待的跨平台的好东西!

    http://code.google.com/p/nativeclient/ https://developers.google.com/native-client/overview

  8. CentOS下的apache配置支持php

    修改Apache的配置文件httpd.conf(vi /etc/httpd/conf/httpd.conf) DirectoryIndex index.html index.php #添加index. ...

  9. qunar-dns

    去哪儿QInfra大会 IT大咖说 - 大咖干货,不再错过   http://www.itdks.com/eventlist/detail/1313

  10. LPC43xx SGPIO Experimentation

    LPC4350 SGPIO Experimentation The NXP LPC43xx microcontrollers have an interesting, programmable ser ...