Node.js URL编码/解码,同一字符串的不同表示形式

Node.js URL编码/解码,同一字符串的不同表示形式,node.js,hash,urlencode,Node.js,Hash,Urlencode,我在这里有点不舒服,所以我甚至不确定我是否正确地解决了这个问题。不管怎样,这里有: 因此,我遇到了一个问题,我将使用sha1散列一些信息,这些信息将用作该信息的id。 当客户机想要发出当前正在使用的信息的信号时,它会发送一个百分比编码的sha1字符串 一个例子是,我的服务器散列了一些信息,得到了如下十六进制表示: 44 c1 b1 0d 6a de ce 01 09 fd 27 bc 81 7f 0e 90 e3 b7 93 08 客户给我发了封信 D%c1%b1%0dj%de%ce%01%09

我在这里有点不舒服,所以我甚至不确定我是否正确地解决了这个问题。不管怎样,这里有:

因此,我遇到了一个问题,我将使用sha1散列一些信息,这些信息将用作该信息的id。
当客户机想要发出当前正在使用的信息的信号时,它会发送一个百分比编码的sha1字符串

一个例子是,我的服务器散列了一些信息,得到了如下十六进制表示:
44 c1 b1 0d 6a de ce 01 09 fd 27 bc 81 7f 0e 90 e3 b7 93 08

客户给我发了封信

D%c1%b1%0dj%de%ce%01%09%fd%27%bc%81%7f%0e%90%e3%b7%93%08

删除我们得到的%s

D c1 b1 0dj de ce 01 09 fd 27 bc 81 7f 0e 90 e3 b7 93 08

除了开头的D和0d之后的j之外,它与我的哈希匹配,但是用ascii十六进制编号替换它们,我们有相同的哈希

因此,正如我已经阅读并理解的urlencoding,该标准将允许客户端以D或%44的形式发送D?所以不同的客户端可以从同一个散列中发送不同的表示,而我不能仅仅比较它们是否相等

我希望能够在发送URL编码的字符串时比较它们,但一种方法是对它们进行解码,删除所有“%”并获取ascii十六进制值,无论出现什么不匹配,就像上面示例中的D和j一样

这一切似乎都是一种非常烦人的做事方式,我是否错过了什么,请告诉我我错过了什么?:)


我是在node.js中这样做的,但我认为解决方案与语言/平台无关。

我现在制作了这个粗糙的解决方案:

var unreserved = 'A B C D E F G H I J S O N K L M N O P Q R S T U V W X Y Za b c d e f g h i j s o n k l m n o p q r s t u v w x y z + 1 2 3 4 5 6 7 8 9 0 - _ . ~';

function hexToPercent(hex){
var index = 0,
end = hex.length,
delimiter = '%',
step = 2,
result = '',
tmp = '';

if(end % step !== 0){
    console.log('\'' + hex + '\' must be dividable by ' + step + '.');
    return result;
}

while(index < end){
    tmp = hex.slice(index, index + step);

    if(unreserved.indexOf(String.fromCharCode('0x' + tmp)) !== -1){
        result = result + String.fromCharCode('0x' + tmp);
    }
    else{
        result = result + delimiter + tmp;
    }
    index = index + step;

}
return result;

}
var unreserved='A B C D E F G H I J S O N K L M N O P Q R S T U W X Y Za B C D E F G H I J S O K L M N O P Q R S T U W X Y z+1 2 3 4 6 7 8 9 0-';
函数hextoppercent(hex){
var指数=0,
端部=六角长度,
分隔符=“%”,
步骤=2,
结果=“”,
tmp='';
如果(结束%step!==0){
log('\''+hex+'\'必须可以被'+step+'分割);
返回结果;
}
while(索引<结束){
tmp=十六进制切片(索引,索引+步长);
if(unreserved.indexOf(String.fromCharCode('0x'+tmp))!=-1){
结果=结果+字符串.fromCharCode('0x'+tmp);
}
否则{
结果=结果+分隔符+tmp;
}
指数=指数+步长;
}
返回结果;
}

为什么客户端发送这样的sha1哈希而不是文本“44C1B10D6ADEC0109FD27BC817F0E90E3B79308”?您是否控制客户端发送的内容?而不是控制客户端,而且据我所知,有多个客户端可以发送同一散列的不同表示形式。有问题的客户机是torrent客户机,如果这很重要的话。