2017-05-24 9 views
0

Javascriptでハッシュ関数を作成しようとしましたが、その1つのバージョンが2文字の文字列で異常な動作をしていました。Javascriptハッシュ短い文字列での異常な動作

function hash(seed) { 
      var genseed = 0; 
      for(i=0;i<seed.length;++i) { 
        genseed += seed.charCodeAt(i)**((seed.length-1)-i); 
      } 
      console.log(genseed) 
    } 

ハッシュ( "AB")やハッシュ( "AX")のような2文字の文字列に対してハッシュを呼び出すと、全く同じ結果になります。はい、私はハッシュの衝突について知っていますが、ここでは、最初の文字が同じであれば、2番目の文字は何も変わらないので、無視されているようです。なぜこれはどうして起こりますか?

+0

'(seed.length-1)-i'とは何ですか? –

+1

もっと複雑な式の代わりに '** i'を使ってみませんか? – Barmar

+0

@OliverCharlesworth seed.lengthは、入力文字列内の文字数です。私はforループがすでに実行されている回数です(このシナリオでは、とにかく) –

答えて

0

問題は、この部分です:** ((seed.length-1)-i)。最後の文字は、** 0と評価されます。 0の力の任意の数は1に等しくなります。そのため、最後の文字は常に1と評価されます。それを** (seed.length-i)に変更しても問題はありません。

1

((seed.length-1)-i)は、length1i=1の場合は0になります。最後の文字に達するたびに0になります。 -1を削除することをおすすめします。そうしないと、最後の文字は無視されます。

function hash(seed) { 
 
    var genseed = 0; 
 
    for (i = 0; i < seed.length; ++i) { 
 
    genseed += seed.charCodeAt(i) ** ((seed.length) - i); 
 
    } 
 
    console.log(genseed) 
 
} 
 

 
hash("AB"); 
 
hash("AX");

+1

これは私がやったことです。私は最後の手紙を無視していた理由を知りたかったのです。ありがとう –

0

2文字の文字列の場合。総数は2回ですので、seed.lengthは2になります。

したがって、2回目の繰り返しで (seed.length-1)-i = 2-1 -1 = 0となります。基本的に、最初の反復から66に等しい最初のgenseedです。

関連する問題