2013-05-27 70 views
0

前一段時間我寫了這個小函數來根據傳遞的參數創建一個唯一的標識。我的問題是,如果有更好的(性能)解決方法。PHP - 根據參數生成唯一的標識

function id_make(/* POLYMORPHIC */) 
{ 
    return md5(serialize(func_get_args())); 
} 

echo id_make(__FILE__, 'something', ['item' => 'some_content']); 
+0

表現爲甚麼?存儲空間更少?計算時間更少? –

+0

'_ _FILE_ _'本身只是一個文件名,但也許給它一個上下文,比如這個文件的內容更有意義。 –

+0

@marc computational – n00b

回答

1

CRC32似乎更快比特然後MD5(http://www.php.net/manual/en/function.crc32.php

json_encode()也是有點快然後序列化()。

+1

'json_encode'也不如'serialize'](http://stackoverflow.com/a/5351788/1729885)更靈活,並且會稍微增加衝突的機率。對於任何可預見的用例來說,當然不是很可能。 –

1

對於給定函數簽名,沒有太多的改善 - 這是在一排,你希望他們做什麼做的正是3鏈函數調用,所以沒有什麼優化或剝離那裏。

鑑於3函數調用或多或少歸結爲內部的本地編譯功能,我也不認爲有一種可能的替代方法可以提供相同級別的靈活性,而不會產生可能的衝突。

所以不,在這個函數中沒有什麼可以改進的地方。如果你需要這種靈活的哈希,外部代碼可能會使用一些優化。

1

我猜測性能問題發生時,試圖通過相當大的對象作爲參數?

我不知道你的腳本的目的,但也許這可能有幫助。也許你應該循環參數,當它是一個對象時,你可以用它的哈希代替它。 請參閱:http://php.net/manual/en/function.spl-object-hash.php

但是因爲正如我所說我不知道​​目的,你應該注意,當對象被銷燬時可能會重複使用相同的散列。