什么字符编码可以为带有数组缓冲区的 md5 产生相同的结果?

what character encoding can yield identical results for md5 with an array buffer?

所以,如果我这样做:

fileReader.onload = function (e) {
    console.log(md5(e.target.result));
};
fileReader.readAsArrayBuffer(blob);

我得到:df9206f11a5c4fc7841fca94522f19f2

但是,如果我这样做:

fileReader.onload = function (e) {
    console.log(md5(e.target.result));
};
fileReader.readAsText(blob);

我得到了一个完全不同的散列。我假设这是由于字符编码?所以我很好奇,我可以使用什么编码来产生相同的哈希值?

使用 readAsArrayBuffer() 会将源读取为 "pure" 字节 范围,与数据表示的内容及其字节顺序无关。

使用没有任何编码选项的 readAsText() 将从源中获取 两个和两个 字节,假定并转换为单个 UTF-16(或 UCS-2)如您所见,这将产生完全不同的结果。

如果您知道来源是 UTF-8 文本格式,您可以使用可选的 encoding options with readAsText(blob[, encoding]) (see supported encoding types).

阅读它

任何常见的单字节编码页面都应该受到影响,在这种情况下,作为文本的 MD5 签名始终在 ASCII 范围内 - 那么主要问题是它需要被读取为 single byte 而不是 UTF-16/USC-2.

的两倍

一个不同的问题可能是字节顺序。对于这种情况,另一种方法是将其读取为 ArrayBuffer,然后使用可用的 TextDecoder (see example answer) with correct byte-order (there is a BOM 选项(ignoreBOM)用于此方法),例如小端或大端(在前面的链接编码器类型中表示为 "le" 和 "be"、f.ex、"utf-16be"。