簡體   English   中英

PHP base轉換為唯一ID

[英]PHP base convert as unique id

我正在使用cassandra中的uuid ,它會生成以下utf8字符串:

f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21

但經過一番谷歌搜索后,我需要將其縮短到4-6個字母之間

base_convert($id, 5, 36);

只是這樣做,但真的會保持獨特性嗎?

這可能是一個愚蠢的問題,但我需要一些解釋。

這不是utf8字符串。 UTF8是字符編碼,UUID甚至可以完美地適合7位編碼。 base_convert()將不起作用,因為UUID不是數字(至少由於-引起)。 不,將其縮短到4個字母不會使它變得更好。 假設您使用0-9和az僅給出36!4個組合,那么發生沖突的可能性就很大(誰知道您如何生成該ID以及該頻率如何)。 通常,如果要唯一,請使其唯一(例如,將已經生成的ID存儲在DB中,以便您知道何時發生沖突)。 現在,您只是希望並嘗試用手指交叉。

從Cassandra Wiki:

[...] UUIDs are represented by a 32 digit hexadecimal number in the form of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

正如我在您的示例UUID中看到的那樣,有一些荒謬的字符,例如rvhq 我認為這是由錯誤引起的,將嘗試回答您的問題:

如果要使用base_convert ,則首先應省略連字符。

base_convert()函數簽名如下:

string base_convert ( string $number , int $frombase , int $tobase )

請注意,在這種情況下, frombase參數應為16而不是5,這是因為UUID是32位十六進制數字。

最后,您可以用作tobase的最大數量為36 (根據手冊 )。

因此,您可以做的最好的事情是:

base_convert($yourNumber, 16, 36);

並且轉換后的數字長度將超過4-6個字符。 因此,不可能通過使用base_convert()來縮小UUID並仍然具有唯一的數字。

從技術上講,如果您將UUID假定為十六進制數字並將其轉換為以128為基數,則結果將為4個字母的長度。

您是否研究過PHP內置的uniqid()函數? 我相信默認情況下,它會返回14個字符串,並使您能夠輸入自定義前綴以添加其他唯一性。

您可以在此處找到有關uniqid()的更多信息: http : //php.net/manual/en/function.uniqid.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM