什么字符编码可以为带有数组缓冲区的 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"。
所以,如果我这样做:
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"。