缺少array_hash()函数。 无法创建数组的哈希值

简介</ strong>:</ p>

我需要一个功能 可以接受一个数组并返回它的散列。</ p>

这应该类似于 spl_object_hash( ),除了它返回给定数组的哈希。</ p>

所以,我已经尝试了</ p>

  function array_hash  (array $ array){

返回spl_object_hash((object)$ array);

}
</ code> </ pre>

问题</ strong> </ p>

1)此算法本身效率不高 。 例如,如果我传递这样的内容:</ p>

  $ array = array(
'foo'=&gt;'bar',
'bool'=&gt; false,
'junk'=&gt; array(
'junk1'=&gt; array('foo'=&gt; array('__ test __'))


</ code> </ pre >

它不会将嵌套数组转换为对象。</ p>

2)另一个主要问题是, spl_object_hash()</ code>返回不同的 每个新HTTP请求上的相同对象的哈希。</ p>

问题</ strong> </ p>

再次:我需要一个持久哈希值 数组。 与 spl_object_hash()</ code>不同,它将在每个HTTP请求上持久化。 如何正确执行此操作?</ strong> </ p>
</ div>

展开原文

原文

Intro:

I need a function that can take an array and return a hash of it.

This should similar to spl_object_hash(), except that it returns a hash for given array.

So, far I've tried

function array_hash(array $array) {

   return spl_object_hash((object) $array); 
}

The problems

1) This algorithm isn't efficient by itself. For example, what if I pass something like this:

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

It won't cast nested arrays to objects.

2) Another major problem is that, spl_object_hash() returns a different hash for the same object on each new HTTP request.

The question

Again: I need a persistent hash for an array. Unlike spl_object_hash(), the will be persistent on each HTTP request. How can I do this correctly?

doubing3662
doubing3662 您可以序列化()它然后哈希()它。
7 年多之前 回复

2个回答



如何首先序列化数组?</ p>

  md5(serialize($ array)  ); 
</ code> </ pre>
</ div>

展开原文

原文

How about serializing the array first?

md5(serialize($array));

dongzhao1865
dongzhao1865 很高兴你有创意!
7 年多之前 回复
dqc42632
dqc42632 谢谢! serialize()适用于对象和数组。 json_decode()在这里会更好,因为它只打算与数组一起使用。 所以我发现这更适合sha1(json_encode($ array))
7 年多之前 回复



Martin的上述答案工作正常,但我做的是:</ p>

  function array_signature  ($ arr,$ sort = true)
{
//排序有助于为类似的数组生成类似的指纹
if($ sort){
array_multisort($ arr);
}

// MD5似乎是最快的散列函数 - 我们不关心它的碰撞
// JSON似乎比serialize()更快
返回md5(json_encode($ arr));
}
</ code > </ pre>

首先调用 array_multisort()</ code>确保对于关联数组,返回相同的签名:</ p>

    \ n
  • ['a'=&gt; 1,'b'=&gt; 2] </ code> </ li>
  • ['b'=&gt; 2,' a'=&gt; 1] </ code> </ li>
    </ ul>

    基准似乎同意: md5()</ code>是PHP中最快的散列函数 。 它有很多潜在的安全问题,因此不应该用于散列密码,但对于数组签名,这应该不是问题。</ p>

    同样, json_encode()</ code>是PHP中最快的编码算法(快于 serialize()</ code>)</ p>
    </ div>

展开原文

原文

The above answer by Martin works fine but what I do:

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));
}

Calling array_multisort() first ensures that, for associative arrays, the same signature is returned for:

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

Benchmarks seem to agree: md5() is the fastest hashing function in PHP. It has a lot of potential security issues so should not be used for hashing passwords, but for an array signature this should not be an issue.

Similarly, json_encode() is the fastest encoding algorithm in PHP (faster than serialize())

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐