针对行长度不一致的HaveIBeenPwned文件,二分查找失败的问题求助
解决HIBP哈希文件二分查找的后缀干扰问题
这个问题我之前帮人排查过类似的——HIBP数据库更新后加的出现次数后缀确实会搞砸依赖固定行格式的二分查找逻辑。核心问题是你现在在拿整行内容和目标SHA1哈希(固定40个十六进制字符)做对比,但带后缀的行长度更长,直接比对自然会不匹配,哪怕哈希本身是存在的。
核心修复思路
HIBP的文件是严格按前40位SHA1哈希值排序的,后面的:次数后缀不影响排序顺序。所以我们只需要提取每行的前40个字符来做二分查找的对比键,完全忽略后面的内容,就能保证二分查找的逻辑依然有效。
具体代码修改
假设你原来的二分查找逻辑里,是直接把读取到的行缓冲区和目标哈希做比较,比如:
// 原来的错误对比逻辑 if (strcmp(line_buffer, target_hash) == 0) { // 认为找到匹配(但带后缀的行永远不会匹配) }
改成只对比前40位的SHA1哈希部分:
// 先清理行尾的换行符,避免干扰 line_buffer[strcspn(line_buffer, "\r\n")] = '\0'; // 正确的对比:只取每行前40个字符和目标哈希比较 if (strncmp(line_buffer, target_hash, 40) == 0) { // 确认找到匹配的哈希 printf("找到目标哈希!"); // 如果需要获取出现次数,可以在这里处理 char *count_ptr = strchr(line_buffer, ':'); if (count_ptr != NULL) { int occurrence_count = atoi(count_ptr + 1); printf(" 出现次数:%d", occurrence_count); } printf("\n"); }
额外注意事项
- 缓冲区大小:确保你的行缓冲区足够容纳最长的行——HIBP的行最长大概是40(哈希)+1(冒号)+最多8位数字(极端情况的出现次数),所以设置64字节的缓冲区完全足够,避免缓冲区溢出。
- 排序一致性:因为HIBP的文件是严格按哈希的字典序排序的,只对比前40位完全符合二分查找的排序前提,不会破坏查找逻辑的正确性。
这样修改后,不管行后面有没有出现次数后缀,二分查找都会精准匹配到对应的哈希行。
内容的提问来源于stack exchange,提问作者MikeS159
相关产品推荐
相关产品推荐

