関数は、文字のみを使用する16進文字列であることが望ましい文字列を取り込みます[0-9a-fA-F]
。次に、2つの16進文字ごとに0〜255の10進整数に変換される配列を作成します。次に、関数はこの配列から最初の131個の要素をすぐに破棄します。これは、文字列の最初の262文字が関数の出力に影響を与えないことを意味します(最初の262文字は任意の文字にすることができます)。
次に、この行があります:
var sliceEnd = charList[0] + charList[1] * 256;
liceEndは、0〜65535(結果の配列の最大サイズ)の数値になります。入力文字列のインデックス262〜265の文字に基づきます。(2つの2桁の16進値が2つの整数に変換されます。位置264の値に256が掛けられ、位置262の値に加算されます)。
次に、結果の配列には、同じ方法を使用して270位から270位までの文字+スライスエンド*2に変換された整数が含まれます。
MSNは、この関数が1対1ではなく、したがって数学的に反転できないことは正しいですが、0から255までの65536未満の整数の配列を指定すると、その配列を返すfooの入力文字列を生成できる関数を記述できます。具体的には、次の関数がまさにそれを実行します。
function bar(arr){
var sliceEnd = arr.length;
var temp = '00' + (sliceEnd & 255).toString(16);
var first = temp.substring(temp.length - 2);
temp = '00' + Math.floor(sliceEnd/256).toString(16);
var second = temp.substring(temp.length - 2);
var str = '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + first + second + '0000';
for(var i = 0; i < arr.length; i++){
temp = '00' + arr[i].toString(16);
str += temp.substring(temp.length - 2);
}
return str;
}
これにより、foo(bar(x)) === x
(xが前述のように0から255までの65536未満の整数の配列である場合)bar(foo(x)) === x
というプロパティが得られますが、MSNが指摘したように、そのプロパティを関数で実現することは不可能であるため、プロパティは得られません。
例えば。bar([17,125,12,11])
文字列を与えます:
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000117dcb"
これを関数への入力として指定するとfoo
、元の配列が返されます[17,125,12,11]
。ただし、他にも多くの入力があります(これらの0のうち少なくとも268は、の値の他の値に[0-9a-fA-F]
する04
ことができ、04より大きい任意の値にすることができます。これは22を意味します。 ^ 268 *(255-4)異なる文字列にもう少し乗算します。これは、小文字または大文字のいずれかのみを考慮し、乗算時に両方を考慮しない255 - 4
ためです。22^ 268は、とにかく1つの出力に対する入力のばかげた数です。それらが上記の文字列で始まり、sliceEnd変数のためにfooから同じ出力を与える他の16進文字列が追加された無限の量の文字列であるという事実を無視します。