Urlencode / decode,相同字符串的不同表示

时间:2014-04-21 17:57:07

标签: node.js hash urlencode

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

所以我有一个问题,我将使用sha1散列一些信息,这些信息将作为该信息的ID。 当客户端想要发出正在使用的当前信息的信号时,它会发送一个百分比编码的sha1-string。

所以一个例子是,我的服务器哈希一些信息并得到十六进制表示如下:
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

删除我们获得的%

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

匹配我的哈希除了0d之后的开始D和j,但是用它们的ascii hex no替换那些,我们有相同的哈希。

因此,正如我已阅读并理解了urlencoding,该标准将允许客户端将D作为D或%44发送?因此,不同的客户端可以从相同的哈希中发送不同的表示,我将无法仅仅比较它们的相等性?

我希望能够比较urlencoded字符串,因为它们是在发送时,但一种方法是解码它们,删除所有'%'并得到ascii十六进制值,用于我得到的任何不匹配,就像上面例子中的D和j一样。

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

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

1 个答案:

答案 0 :(得分:0)

我现在制作了这个原油解决方案:

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;

}