0

イントロ:

配列を取り、そのハッシュを返すことができる関数が必要です。

これはspl_object_hash()に似ていますが、指定された配列のハッシュを返す点が異なります。

だから、これまで私が試した

function array_hash(array $array) {

   return spl_object_hash((object) $array); 
}

問題点

1) このアルゴリズムは、それ自体では効率的ではありません。たとえば、次のようなものを渡すとどうなりますか。

  $array = array(
     'foo' => 'bar',
     'bool' => false,
     'junk' => array(
         'junk1' => array('foo' => array('__test__'))
      )
  )

ネストされた配列をオブジェクトにキャストしません。

2) もう 1 つの大きな問題は、spl_object_hash()新しい HTTP リクエストごとに同じオブジェクトに対して異なるハッシュを返すことです。

質問

繰り返しますが、配列の永続的なハッシュが必要です。とは異なりspl_object_hash()、 は各 HTTP 要求で持続します。どうすればこれを正しく行うことができますか?

4

2 に答える 2

1

マーティンによる上記の答えはうまくいきますが、私は何をしますか:

function array_signature($arr, $sort=true)
{
    // Sorting helps generating a similar fingerprint for similar arrays
    if($sort) {
        array_multisort($arr);
    }

    // MD5 seems to be the fastest hashing function -- we don't care about collision for this
    // JSON seems faster than serialize()
    return md5(json_encode($arr));
}

最初に呼び出す array_multisort()と、連想配列の場合、次のものに対して同じ署名が返されることが保証されます。

  • ['a'=>1, 'b'=>2]
  • ['b'=>2, 'a'=>1]

ベンチマークは一致しているようです:md5()は PHP で最速のハッシュ関数です。多くの潜在的なセキュリティ上の問題があるため、パスワードのハッシュには使用しないでください。ただし、配列署名の場合、これは問題になりません。

同様に、json_encode()は PHP で最速のエンコード アルゴリズムです (より高速ですserialize()) 。

于 2015-01-15T17:28:11.867 に答える
1

最初に配列をシリアル化するのはどうですか?

md5(serialize($array));
于 2013-03-05T03:47:22.097 に答える