2011-06-24 8 views
1

こんにちは、私はRuby言語でPHP関数を変換しようとしています。結果が異なるため があるがエラーである PHP言語での関数は次のとおりです。phpからrubyへの変換でエラーが発生しました

function rpHash($value) { 
    $hash = 5381; 
    $value = strtoupper($value); 
    for($i = 0; $i < strlen($value); $i++) { 
     $hash = (($hash << 5) + $hash) + ord(substr($value, $i)); 
    } 
    return $hash; 
} 

私はルビーで作ってみました機能は次のとおりです。私もその指摘してきた

def real_person_hash value 
    hash = 5381 
    value = value.to_s.upcase 
    for i in 0..(value.length - 1) 
     hash = ((hash << 5) + hash) + value[i] 
    end 
    hash 
end 

Es. 
value = "nzxs" 
php function returns: 
2089377688 
ruby function : 
6384344984 

サイクルの最初の3つの値は等しい。最後のサイクルでのみ異なる なぜですか?

+0

あなたはどのバージョンのRubyをお使いですか?これを実行しているサンプル値を両方の出力から得ることができますか? – Dogbert

+0

私は上記の例を挙げました。私はruby reeを使っています。1.8.7 –

+0

この例では値が逆になっていると思います。 – Dogbert

答えて

3

PHPは任意の長さの整数演算、it overflowsをサポートしていませんが、Rubyはオーバーフローしません。この投稿は、整数の異常を詳細にPHPに溢れた説明:あなたは、これは「nzxs」= 2089377688

編集のための正しい値を与える

def real_person_hash value 
    hash = 5381 
    value = value.to_s.upcase 
    for i in 0..(value.length - 1) 
    hash = ((hash << 5) + hash) + value[i] 
    end 
    if hash < -2147483648 
    -(-(hash) & 0xffffffff) 
    elsif hash > 2147483647 
    hash & 0xffffffff 
    else 
    hash 
    end 
end 

ような何かをする必要があります。要するに、関数の結果は、使用しているPHP実装によって異なります。私はそのポストで言及されたソリューションのためのRuby同等物を返す関数を編集しました。 Force PHP integer overflow

関連する問題