我需要在客户端(reactjs)上计算文件的MD5哈希值,然后将此哈希值发送到服务器端(Web API / C#),以查看其是否已经存在。由于某种原因,我在两侧之间得到了不同的哈希值。我以为这可能是编码方面的问题,但是我不确定。
这是反应成分:
import React, { Component } from 'react';
import { Button } from 'react-bootstrap';
import md5 from 'crypto-js/md5';
export default class TestFileUploadMd5 extends Component {
constructor(props) {
super(props);
this.state = {
selectedFile: null
}
}
onFileChanged(e) {
var file = e.target.files[0];
this.setState({ selectedFile: file });
}
calculateMd5() {
var md5Hash = md5(this.state.selectedFile);
var md5HashString = md5Hash.toString();
}
render() {
var self = this;
return (
<div>
<input type="file" onChange={(e) => this.onFileChanged(e)} />
<Button onClick={(e) => this.calculateMd5()}>Calculate</Button>
</div>
)
}
}
在服务器端,我使用标准方法来流式传输文件并计算哈希:
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var file = provider.Contents[0];
var blob = await file.ReadAsByteArrayAsync()
var md5 = System.Security.Cryptography.MD5.Create();
byte[] hash = md5.ComputeHash(blob);
var sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
sb.Append(hash[i].ToString("X2"));
有人知道为什么两个哈希不同吗?
更新
客户端反应版本产生: 487f7b22f68312d2c1bbc93b1aea445b
服务器c#版本产生: 8828414F794468DF83D346BF0FE7CFE
我还通过SQL SERVER的HASHBYTES('md5',blob)确认了C#版本
在调用md5Hash.toString()之前,这是md5Hash.words中数组项的值: