我在这里有点不舒服,所以我甚至不确定我是否正确地解决了这个问题。无论如何,这里是:
所以我有一个问题,我将使用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中这样做,但我想解决方案是语言/平台无关。
答案 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;
}