2011-10-17 86 views
3

是否有可能在PHP5.3中获得标量/数组变量的唯一标识 像对象的对象散列一样。例如,我有:变量$ a和变量的唯一标识(如spl_object_hash)

$a = array(1, 2, 3); 
$b = &$a; 

如此独特的ID $ B,必须是相同的,从内存指针也许derrived。 我没有找到spl_object_hash的任何替代功能。

+0

PHP没有按” t做内存指针。至多你可以做'md5(serialize($ a))'来获得一个签名,但是这不会让你区分恰好具有相同内容的两个海洋数组。 –

+0

我认为,PHP在内部参考表中有内存指针。所以我正在寻找一些来自他们的身份证件。我不能使用数据散列。两个变量(其中第一个不是第二个参考)可以具有相同的值。 – opio

+0

是的,它在内部具有标准C/C++指针,但它们不会暴露于脚本级别。 –

回答

2

小解决方法:

function unique_var($var) { 
    return md5(serialize($var)); 
} 
+5

只有问题在于它无法区分两个不同的变量,具有相同的值,我认为这可能在这里需要。 – DaveRandom

+0

不确定它需要区分不同的阵列。他说'$ a'和'$ b'的唯一ID必须相同;这将使用彼得的技术。但是,当然,我可以使用相同的数据创建另一个新数组,并获得相同的散列,这可能就是您的意思。 –

+0

确切地说,我需要唯一的ID,而不是数据散列,因为相同的值问题。对不起,我的回答并不那么确切。 – opio

-1
function createHash($salt, $extra, $length = 8) 
{ 
    $hashSeed = sprintf(
     '%d:%s:%s', 
     microtime(true), 
     $salt, 
     hash('sha1', $extra) 
    ); 
    do { 
     $hashSeed .= ':' . uniqid(); 
     $hash  = hash('sha256', $hashSeed); 
     $hash  = substr($hash, 0, $length); 
    } while (hashExists($hash)); // loop until `hashExists` returns `FALSE`. 
    return $hash; 
} 

function hashExists($hash) 
{ 
    // ... check if $hash is unique ... 
    // for example by comparing with a list of stored hashes 

    return false; // return false when $hash is unique 
} 

例如,你可以使用它像这样:

$arr = array(1, 2, 3); 
$salt = $arr[0]; // generate some salt, could be anything 
$extra = $arr[1] . $arr[2]; // generate some extra spice 
$length = 32; // let’s get a long hashcode (defaults to 8) 
$hash = createHash($salt, $extra, $length); 

print 'Hashcode: ' . $hash; 

这将输出的东西沿着这些路线:

Hashcode: 3d267e5c1232476b75d8c3dbe68474c9 
+0

这与以前的答案有什么不同?其他人不做的是什么? – Charles

+0

$ hashSeed中添加的microtime使其不同,因此包含相似数据的两个数组将生成不同的哈希码。 –

+0

我想你可能会误解这个问题。问题是关于如何唯一标识PHP中给定的变量。这不是关于创建独特的哈希值。 – Charles