You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#与Node.js使用xxHash32计算文件哈希结果不一致如何解决

问题根因

结果不一致和Buffer、C#字节数组的类型差异无关,是你的Node.js代码存在两处核心错误,同时入参没有和C#端对齐:

  • 多余的字节转换逻辑完全破坏了原始文件内容:你将读取到的文件Buffer转成hex字符串后,又拼接成0xXX格式的字符串数组再重新转Buffer,最终得到的内容是字符串的UTF-8编码,和原文件字节完全无关。
  • 入参没有和C#端对齐:你C#代码调用hash方法时第二个参数传的是10,对应计算前10个字节的哈希,seed用的是默认值0;但Node端你不仅没有截取前10字节,还额外把错误生成的Buffer转成了Uint32Array,进一步扭曲了输入数据。
修复方案

fs.readFileSync返回的Buffer本身就和C#中File.ReadAllBytes返回的字节数组完全一一对应,不需要做任何额外格式转换。

对齐现有C#逻辑(计算前10字节哈希)

如果你C#端确实是要计算文件前10字节的哈希,Node端直接用以下代码即可:

const XXHash = require('xxhash');
const fs = require('fs');
const path = require('path');

// 直接读取文件得到原始字节Buffer,和C#读取结果完全一致
const fileBuffer = fs.readFileSync(path.join(__dirname, "/Files/nfts/bow.png"));
// 对齐C#参数:取前10字节、seed为0计算xxHash32
const result = XXHash.hash(fileBuffer.subarray(0, 10), 0);

对齐全文件哈希逻辑

如果你本意是计算整个文件的哈希,先修正C#端的调用,把长度参数改为文件字节总长度:

string p = "C:\\Users\\abc\\Documents\\bow.png";
byte[] fileBytes = File.ReadAllBytes(p);
// 传入全量字节长度,计算整个文件的哈希
x = hash(fileBytes, fileBytes.Length, 0);

对应的Node端代码不需要截取字节,直接传入完整Buffer即可:

const XXHash = require('xxhash');
const fs = require('fs');
const path = require('path');

const fileBuffer = fs.readFileSync(path.join(__dirname, "/Files/nfts/bow.png"));
const result = XXHash.hash(fileBuffer, 0);
注意事项

只要保证两端输入的字节序列完全一致、seed参数相同、计算的字节长度相同,标准xxHash32算法的输出结果一定一致,不需要额外做类型转换。

内容的提问来源于stack exchange,提问作者youngtoken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:51:18