HashMap
PHPで一種のクラスを作成したいと思っています。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;
}
}