2011-03-13 25 views
1

我期待在PHP中创建一种HashMap类。为了能够构建PHP的关联数组功能,我有一个散列函数,它应该能够接受任何变量(基元或对象)并将其转换为一个字符串以用作数组键。PHP的序列化作为哈希函数的副作用

对于这个散列函数,我正在考虑使用serialize(),但我注意到当调用该函数时,PHP在对象上调用__sleep()。我假设这可能是有问题的。我对吗?

如果是这样,我可以使用什么来获得原始数据类型或对象的哈希值?我确实看过spl_object_hash(),但它的结果看起来不是唯一的,因为它使用的参考位置似乎被重用?

有什么想法?谢谢

更新:如果任何人有兴趣,这是(粗略地说)我结束了。 Collection接口可以被忽略。当然,欢迎任何改进。 哦,还没有删除的方法。

<?php 

include_once 'Collection.php'; 

class HashMap implements Collection { 

    private $data; 
    private $hashes; 

    public static function createEmpty() { 
     return new HashMap(); 
    } 
    public function __construct() { 

     $this->data = new \SplObjectStorage(); 
     $this->hashes = array(); 
    } 

    public function add($key, $value) { 
     // var_dump($this->hash($key)); 
     $this->data->offsetSet($this->hash($key), $value); 
    } 

    private function hash($key) { 
     if (!is_object($key)) { 
      if (isset($this->hashes[$key])) { 
       return $this->hashes[$key]; 
      } else { 
       $obj = new PrimitiveAsObject(serialize($key)); 
       return ($this->hashes[$key] = $obj); 
      } 
     } else { 
      return $key; 
     } 
    } 

    public function get($key) { 
     $key = $this->hash($key); 

     if ($this->data->contains($key)) { 
      return $this->data->offsetGet($key); 
     } else { 
      return null; 
     } 
    } 

} 
class PrimitiveAsObject { 
    private $val; 
    public function __construct($v) { 
     $this->val = $v; 
    } 
} 
+1

isnt关联数组已经是一个哈希映射? – 2011-03-13 17:49:54

+0

@jon_darkstar是的,但它不允许使用对象作为键,这是我需要的东西。 – Adam 2011-03-13 17:52:10

+1

一个序列化的对象作为一个键... :)哇,你能说出你在用什么,听起来很神奇。 – markus 2011-03-13 17:54:08

回答

3

你提到你正在尝试使用对象作为键的哈希,以存储更多数据。

PHP-5.3 SPL Object Storage这个标准的类是为这个用例设计的,虽然它使用起来很时髦。幸好,它可以表现为一个数组。

现在,它只能用于存储实际的对象,而不是基元。这可能会对您的用例造成问题,但它可能是您将对象存储为键的最佳选择。

+0

究竟是什么时髦? – Wrikken 2011-03-13 17:57:42

+0

基于非数组的attach/contains/detach方法只会让我感到怪异,就是这样。 – Charles 2011-03-13 17:59:57

+0

听起来不错,我依稀记得前一阵子看着这个。我同意它的趣味性 - 如果它不会影响性能,我可能会放一个包装类。 – Adam 2011-03-13 18:08:30

-2

您可以md5

http://php.net/manual/en/function.md5.php

凑但是,当然,你需要一个可靠和参与的对象独特toString

+0

我需要能够获取任何对象的散列,而不仅仅是一个字符串。 – Adam 2011-03-13 17:53:14

+0

你应该用hmac代替http://php.net/manual/en/function.hash-hmac.php – Trevor 2011-03-13 17:54:12

+0

我不想依赖任何对象的'toString()'实现,因为我不知道这些物体来自哪里。 – Adam 2011-03-13 18:03:58