2011-03-13 3 views
1

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; 
    } 
} 
+1

isnt 연관 배열은 이미 해시 맵입니까? –

+0

@jon_darkstar 네,하지만 객체를 키로 사용할 수 없기 때문에 필요한 것입니다. – Adam

+1

직렬화 된 객체를 키로 사용하면 ... :) 와우, 당신이 사용하고있는 것을 놀랍게 들릴 수 있습니까? – markus

답변

3

당신은 추가 데이터를 저장하기 위해, 해시의 키로서 객체를 사용하려는 언급했습니다.

PHP-5.3-SPL Object Storage 표준 클래스는이 유스 케이스에 맞게 설계되었지만 사용하기에 다소 재미 있습니다. 고맙게도 배열로 작동 할 수 있습니다.

이제는 프리미티브가 아닌 실제 객체 만 저장할 수 있습니다. 이로 인해 유스 케이스에 문제가 생길 수 있지만, 객체를 키로 저장하는 데있어 가장 좋은 방법 일 것입니다.

+0

정확히 그것에 대해 펑키 한 것은 무엇입니까? – Wrikken

+0

비 배열 기반의 첨부/포함/분리 방법은 저를 * 이상하게 여기겠습니다. 그게 전부입니다. – Charles

+0

꽤 괜찮은 것 같습니다. 나는 얼마 전에 이것에 대해 모호하게 기억하고있다.그 퍼포먼스에 동의합니다. 퍼포먼스에 너무 많은 영향을 미치지 않는다면 아마 래퍼 클래스를 넣을 것입니다. – Adam

-2

당신은 md5

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

와 해시 수 있지만 물론 당신은 신뢰할 수 있고 관련 개체에 대한 toString 독특한 필요합니다. 키와

+0

문자열이 아닌 모든 객체의 해시를 가져올 수 있어야합니다. – Adam

+0

대신 hmac을 사용해야합니다. http://php.net/manual/en/function.hash-hmac.php – Trevor

+0

모르겠지만 어떤 객체의'toString() 구현에 의존하고 싶지 않습니다. 이 객체들이 어디서 오는지. – Adam

관련 문제