2011-10-17 27 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