Fletchers16 校验和适合小数据吗?

2024-03-30

使用直接实施维基百科弗莱彻的校验和 https://en.wikipedia.org/wiki/Fletcher's_checksum对于“BCA”和“CAB”以及“BAC”和“ACB”等数据,我们得到相同的校验和。

这是预期的吗?
Fletcher16 校验和不应该考虑块的顺序吗?

通过将索引与数据进行“或”操作可以轻松修复该缺陷,如下面的代码所示......

uint16_t fletcher16( uint8_t *data, int count )
{
   uint16_t sum1 = 0;
   uint16_t sum2 = 0;
   int index;

   for( index = 0; index < count; ++index )
   {
      //sum1 = (sum1 + data[index]) % 255; // Original
      sum1 = (sum1 + index | data[index]) % 255; // The "fix"
      sum2 = (sum2 + sum1) % 255;
   }

   return (sum2 << 8) | sum1;
}

...我们得到相同的校验和...这是预期的吗?

是的,因为这是可能的。校验和是 16 位(并且永远不会出现 511 种组合:0x..FF, 0xFF..)所以3个24位的字符串肯定会发生冲突。鸽巢原理 https://en.wikipedia.org/wiki/Pigeonhole_principle

Fletcher16 校验和不应该考虑块的顺序吗?

确实如此。只是该算法很容易与选择的相似输入发生冲突。另请参阅汉明距离 https://en.wikipedia.org/wiki/Hamming_distance

顺便说一句,如果长度或大小(还要检查空字符使用字符串的 )。此外,4 个输入字符串给出了一对不同的结果。

  printf("%x\n", fletcher16("BCA",3)); // 8ec6
  printf("%x\n", fletcher16("CAB",3)); // 8ec6 same
  printf("%x\n", fletcher16("BAC",3)); // 8cc6 
  printf("%x\n", fletcher16("ACB",3)); // 8cc6 same

  printf("%x\n", fletcher16("BCA",4)); // 55c6
  printf("%x\n", fletcher16("CAB",4)); // 55c6 same
  printf("%x\n", fletcher16("BAC",4)); // 53c6
  printf("%x\n", fletcher16("ACB",4)); // 53c6 same

OP 建议的改进还通过在索引中进行“或”运算来削弱校验和,这会忽略每个阶段的选择位。建议进行异或或添加。


轻微尼特:

// return (sum2 << 8) | sum1;
return (1u*sum2 << 8) | sum1;

这一变化并不会对所有人产生不利影响int/unsigned大小但避免实现定义的行为int/unsigned是 16 位的。最好确保代码不会左移到符号位。

some_int % 255执行有符号余数。在设备上,例如简单的嵌入式设备,无符号余数肯定同样快或更快。没有什么可以失去的% 255u,但有潜在的改进。

[Edit]

尽管 OP 对于短字符串有“固定”代码,但它破坏了设计参数fletcher16(),即执行速度。


详细信息:如果我们抛开%255, sum1 is data[0] + ... + data[count-1]) and sum2 is data[0]*(count) + data[0]*(count-1) + ... + data[count-1]*(1),很容易创建 1,2,3 等长字符串,其值较低,几乎不会产生(如果有的话)%255运营。

请注意sum2是根据顺序有效创建不同校验和的部分。如果数组元素的总和永远不会达到 255(这发生在 OP 的 4 个测试用例中),sum1对于任何 2 个仅顺序不同的字符串来说都是相同的。

为了有效地“混合/散列”具有低值的短字符串,需要不同的算法。

也许仅在以下情况下使用变体:count < 8:

sum1 = (sum1 + index + data[index]) % 255;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fletchers16 校验和适合小数据吗? 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐

  • 如何使用elasticsearch正确处理多词同义词扩展?

    我有以下同义词扩展 suco gt suco refresco bebida de soja 我想要的是以这种方式标记搜索 搜索 suco de laranja 将被标记为 suco laranja refresco bebida de s
  • 在 ggplot 或lattice 中利用 Surv 对象

    有人知道如何利用 ggplot 或lattice 进行生存分析吗 制作网格或类似面的生存图会很好 所以最后我尝试了一下 找到了卡普兰 迈耶图的解决方案 对于将列表元素放入数据框中的混乱代码 我深表歉意 但我无法找到其他方法 注意 它仅适用于
  • Jenkins Git 插件包含不工作的区域

    我无法使用 Git 插件在 Jenkins 中使用 包含区域 功能 我希望仅在 他的 目录发生更改时才构建作业 示例 项目 mytool 仅应在以下内容发生更改时构建GIT ROOT tools mytool 我在包含的区域字段中尝试了几种
  • 删除默认标题栏

    如何删除 Android 应用程序中默认的顶部标题栏 灰色的你好 Android 吧 删除标题栏非常简单 只需将 android theme 属性添加到 AndroidManifest xml 中即可
  • ICollection 的简单现有实现

    有没有简单的实现ICollection
  • AngularJS 指令中的 locals 代表什么

    AFAIK 这没有记录 但我在角度源中发现locals指令示例中的属性 angular module transclude directive pane function return restrict E transclude true
  • 如何使用已安装的斜纹登录网站?

    我刚刚安装成功TWILL https web archive org web 20180904160747 http twill idyll org 80 在 StackOverflow 一位非常支持的成员的帮助下在我的计算机上 你可以查看
  • 通用协方差和转换为 SuperType

    我有一个面向对象的问题 我认为它可以与通用协方差联系起来 我正在尝试构建一个模块化系统来导入不同类型的记录 模块包含常用方法 SalesModule 包含处理特定逻辑的函数 public interface IImportable void
  • 克隆 jQuery UI 日期选择器时出现问题

    我有一个 div 其中有一个日期选择器 我用这样的东西来克隆它 mydiv someDiv works fine so far mydiv find input datefield datepicker clone without the
  • C#BackgroundWorker 的文化

    我想为我的整个应用程序设置文化 我尝试了以下操作 Thread CurrentThread CurrentCulture CultureInfo CreateSpecificCulture wantedCulture Thread Curr
  • 浏览器之间盒子模型的不同解释

    我注意到浏览器之间在宽度方面存在差异TH标签被解释 特别是宽度计算中是否包含填充 我正在构建一个可重用的库 用于快速生成表格和设计表格样式 当然 对于表格数据 这意味着我可以完全控制我生成的代码 但我需要实际解决问题而不是为特定实例寻找黑客
  • Qt 和 CMake 因重复符号而失败

    我的 c qt 项目中有 3 个文件 并且我正在使用 CMake 我正在尝试编译它这里有一些代码 CMakeLists 包含 cmake minimum required VERSION 3 8 project untitled set C
  • Apache Commons Lang 2 与 3

    在我的应用程序中 我使用 apache commons Lang v 3 所需的图书馆给我一个 java lang ClassNotFoundException org apache commons lang StringUtils com
  • 在 Rails 中添加与 simple_form、nested_form 和 Twitter Bootstrap 内联的控件

    我正在使用 simple form nested form 和 Twitter Bootstrap 并尝试将nested form 中的 删除链接 与对象放在同一行 现在看起来像这样 http grab by eKDS http grab
  • 安装适用于 Python 的 cx_Oracle

    在 Debian 5 上 我一直在尝试为 python 安装 cx oracle 模块 但没有成功 首先 我安装了 oracle xe client 及其依赖项 按照以下链接中的教程here http le gall net pierric
  • MSXML 哪个版本开始支持解析 XML 1.1?

    如果我使用 MSXML6 dll 解析 XML 1 1 我将收到此错误 0xC00CE57F MSG E INVALID VERSION 版本号无效 XML 1 1 最初发布于 2004 年 2 月 4 日 令我惊讶的是 MSXML6 dl
  • TDD 新手:是否有带有测试的示例应用程序来展示如何进行 TDD?

    我真的很想进入 TDD 开发 但我不知道从哪里开始 我认为 查看代码并了解他们如何编写测试并使类可测试 这样我会更容易消化并开始使用自己 有谁知道任何示例或小型开源C 包含单元测试的应用程序 对于沙卡尔佩什来说 我会推荐 ObjectMen
  • with() 语句从 opencv 中的 VideoCapture 读取?

    我喜欢使用 with 语句来访问文件和数据库连接 因为如果出现错误或文件关闭 它会自动为我断开连接 f open file txt r for i in f print i f close versus with open file txt
  • 在 bash 中读取以空格分隔的文件,不会导致空字段崩溃

    我正在尝试在 bash 中读取多行制表符分隔的文件 格式要求为空字段 不幸的是 外壳正在将彼此相邻的字段分隔符折叠在一起 如下所示 IFS t read one two three lt lt lt one t tthree printf
  • Fletchers16 校验和适合小数据吗?

    使用直接实施维基百科弗莱彻的校验和 https en wikipedia org wiki Fletcher s checksum对于 BCA 和 CAB 以及 BAC 和 ACB 等数据 我们得到相同的校验和 这是预期的吗 Fletche