1

HashMapPHPで一種のクラスを作成したいと思っています。PHPの連想配列機能に基づいて構築できるようにするために、ハッシュ関数を使用します。ハッシュ関数は、任意の変数(プリミティブまたはオブジェクト)を取得して、配列キーとして使用するための文字列に変換できる必要があります。

このハッシュ関数には、を使用することを考えていますが、その関数が呼び出されると、PHPがオブジェクトをserialize()呼び出すことに気付きました。__sleep()これは問題になる可能性があると思います。私は正しいですか?

もしそうなら、プリミティブデータ型またはオブジェクトのハッシュを取得するために何を使用できますか?を確認しましspl_object_hash()たが、再利用されているように見える参照場所を使用しているため、結果は一意ではないように見えますか?

何かご意見は?ありがとう

更新:誰かが興味を持っているなら、これは(大まかに言えば)私が最終的に得たものです。コレクションインターフェイスは無視できます。もちろん、どんな改善も歓迎します。ああ、そしてremoveメソッドはまだありません。

<?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 に答える