2012-02-27 28 views
4

我有一個SQL表,它使用字符串作爲鍵。我需要使用PHP將該字符串(最多18個字符)轉換爲一個唯一的(!)4字節整數。誰能幫忙?從PHP中的一個字符串創建一個唯一的4字節整數

+1

你將如何適應一個18字節的字符串爲4個字節的整數? – 2012-02-27 18:15:28

+0

不可以。沒有足夠的4字節整數來覆蓋所有可能的字符串。 – 2012-02-27 18:15:57

+0

18個字符的字符串有18個字節。你說「_max._ 18個字符」,因此有更多的組合,那麼說18個字節。現在,您要將18字節壓縮爲4字節。這可能會工作一段時間,但不長。 – KingCrunch 2012-02-27 18:17:13

回答

0

將字符串查找表保存爲整數。每次遇到新字符串時,都將其添加到映射表併爲其分配一個新的唯一ID。這將適用於大約2^32個字符串,這可能就足夠了。

對於2^32個不同的字符串,沒有辦法做到這一點。

+0

不唯一,最終會有碰撞。 OP正在要求獨特的映射。 – Piskvor 2012-02-27 18:24:07

+0

這是_is_唯一的。最多2^32個按鍵。正如我所說。這是對理論上無法解決的問題的實際答案。它是正確的。 – usr 2012-02-27 18:27:27

+0

好吧,但是您沒有重新創建SQL的自動增量密鑰嗎? – Piskvor 2012-02-27 19:07:59

0

你不能。四字節整數可以表示2^32 = 40億個值,這不足以保存目標空間。

如果您當前在表中的行數少於40億行,則可以創建一個交叉表,該交叉表只爲每個表分配增量值。採用這種方法,您將被限制在40億行,但這可能適合您的情況。

1

Unique?不可能,對不起

讓我們來仔細看看:

隨着18個字符,即使我們假定只有ASCII的128點可能的字符(7位),你會得到128^18個可能的字符串(我不即使進入更短的字符串的可能性!),這是大約8E37(8和37個零)。

對於一個4字節的整數,你會得到256^4個可能的整數,大約是4E9(40億)。

所以,你有大約4E28更多的字符串比你有整數;你不能有一個獨特的映射。

因此,只要輸入4294967297鍵,您一定會遇到碰撞,但只要您輸入多個鍵,就可能會遇到碰撞。

參見:http://en.wikipedia.org/wiki/Pigeonhole_principle

相關問題