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;
}
}
isnt 연관 배열은 이미 해시 맵입니까? –
@jon_darkstar 네,하지만 객체를 키로 사용할 수 없기 때문에 필요한 것입니다. – Adam
직렬화 된 객체를 키로 사용하면 ... :) 와우, 당신이 사용하고있는 것을 놀랍게 들릴 수 있습니까? – markus