我期待在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关联数组已经是一个哈希映射? – 2011-03-13 17:49:54
@jon_darkstar是的,但它不允许使用对象作为键,这是我需要的东西。 – Adam 2011-03-13 17:52:10
一个序列化的对象作为一个键... :)哇,你能说出你在用什么,听起来很神奇。 – markus 2011-03-13 17:54:08