Javascript 为什么我对crypto.sublt.digest的实现会导致等长字符串的等效十六进制哈希?

Javascript 为什么我对crypto.sublt.digest的实现会导致等长字符串的等效十六进制哈希?,javascript,hash,cryptography,sha256,webcrypto-api,Javascript,Hash,Cryptography,Sha256,Webcrypto Api,以下代码改编自这两个来源: (函数(){ “严格使用”; var crypto=window.crypto | | window.msCrypto; if(typeof crypto.division==“未定义”){ 返回; } 函数转换器StringToArrayBuffer(str){ var strLength=str.length,buffer=newarraybuffer(strLength),i=0; 而(i

以下代码改编自这两个来源:

(函数(){
“严格使用”;
var crypto=window.crypto | | window.msCrypto;
if(typeof crypto.division==“未定义”){
返回;
}
函数转换器StringToArrayBuffer(str){
var strLength=str.length,buffer=newarraybuffer(strLength),i=0;
而(i
使用
sha256.digest(“这个字符串”).then(函数(x){console.log(x)})在Chrome或Firefox控制台中运行时生成相同的十六进制字符串

事实上,任何两个长度相同的字符串都具有相同的十六进制表示形式


我读过的所有资料都表明,拥有两个相等的哈希值是很少见的。这意味着我做错了什么。我不知道那是什么。

好吧,我终于弄明白了

根据MDN,不能直接将值分配给ArrayBuffer

相反,您必须使用Uint8Array、Uint16Array、DataView等为ArrayBuffer赋值

所以我改变了

function convertStringToArrayBuffer (str) {
    var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
    while (i < strLength) {
        buffer[i] = str.charCodeAt(i);
        i += 1;
    }
    return buffer;
}
函数convertStringToArrayBuffer(str){
var strLength=str.length,buffer=newarraybuffer(strLength),i=0;
而(i

函数convertStringToArrayBuffer(str){
var strLength=str.length,buffer=newuint8array(strLength),i=0;
而(i
瞧D

等长字符串不再具有匹配的哈希

function convertStringToArrayBuffer (str) {
    var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
    while (i < strLength) {
        buffer[i] = str.charCodeAt(i);
        i += 1;
    }
    return buffer;
}
function convertStringToArrayBuffer (str) {
    var strLength = str.length, buffer = new Uint8Array(strLength), i = 0;
    while (i < strLength) {
        buffer[i] = str.charCodeAt(i);
        i += 1;
    }
    return buffer;
}