1

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

3 回答 3

3

您已经提到您正在尝试将对象用作哈希中的键,以存储其他数据。

PHP-5.3 中的标准SPL 对象存储类是为这个用例设计的,尽管它使用起来有点时髦。谢天谢地,它可以表现得像一个数组。

现在,它只能用于存储实际对象,而不是原语。这可能会给您的用例带来问题,但这可能是您将对象存储为键的最佳方式。

于 2011-03-13T17:56:16.370 回答
2

对象作为键:SplObjectStorage

于 2011-03-13T17:55:48.320 回答
-2

你可以用md5

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

但当然,您需要一个可靠且独特toString的对象。

于 2011-03-13T17:52:10.960 回答