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)另一个主要问题是,spl_object_hash()在每个新的 HTTP 请求上为同一个对象返回不同的哈希值。

问题

再说一遍:我需要一个数组的持久散列。与 不同spl_object_hash()的是, 将在每个 HTTP 请求上保持不变。我怎样才能正确地做到这一点?

4

2 回答 2

1

先序列化数组怎么样?

md5(serialize($array));
于 2013-03-05T03:47:22.097 回答
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 回答