PHP base转换为唯一ID

时间:2012-11-24 15:55:32

标签: php unique

我正在使用来自cassandra的uuid生成此utf8字符串:

f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21

但我需要将它缩短到4-6个字母之间,经过一些谷歌搜索后我发现了

base_convert($id, 5, 36);

只有这样,但它真的会保持独特吗?

这可能是一个愚蠢的问题,但我需要一些解释。

3 个答案:

答案 0 :(得分:3)

这不是utf8字符串。 UTF8是字符编码,UUID甚至完全适合7位编码。 base_convert()将无效,因为UUID不是数字(至少由于-而导致)。不,将它缩短为4个字母不会让它变得更好。假设您使用0-9而a-z仅提供36!4组合,因此碰撞很可能(谁知道您如何生成该ID以及频率)。通常 - 如果您想要唯一 - 使其唯一(例如,在DB中存储已生成的ID,以便您知道何时发生冲突)。现在你只是希望并尝试用手指。

答案 1 :(得分:2)

来自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(根据manual)。

所以你能做的最好的事情是:

base_convert($yourNumber, 16, 36);

,转换后的数字长度将超过4-6个字符。 因此,使用base_convert()缩小UUID并且仍然具有唯一编号是不可能的。

从技术上讲,如果您将UUID假设为十六进制数并将其转换为128,那么您将得到4个字母长度的结果。

答案 2 :(得分:1)

您是否研究过内置于PHP的uniqid()函数?我相信它默认返回一个14个字符的字符串,并且您可以输入自定义前缀以添加其他唯一性。

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