2

我正在使用uuid从 cassandra 生成此 utf8 字符串:

f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21

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

base_convert($id, 5, 36);

哪个做到了这一点,但它真的会保持独特吗?

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

4

3 回答 3

3

这不是 utf8 字符串。UTF8 是字符编码,而 UUID 甚至完全适合 7 位编码。base_convert()将不起作用,因为 UUID 不是数字(至少由于-)。不,将其缩短为 4 个字母不会让它变得更好。假设您使用 0-9 并且 az 仅给出 36!4 个组合,因此很可能发生碰撞(谁知道您如何生成该 ID 以及多久生成一次)。一般来说 - 如果你想要独一无二 -让它独一无二(比如将已经生成的 ID 存储在数据库中,这样你就知道何时发生冲突)。现在您只是希望并尝试交叉手指。

于 2012-11-24T16:03:22.413 回答
2

来自卡桑德拉维基:

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

正如我在您的示例 UUID 中看到的那样,有一些荒谬的字符,例如r,和. 我认为这是由错误引起的,并将尝试回答您的问题:vhq

如果你想使用base_convert,首先你应该省略连字符。

base_convert()函数签名如下:

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

请注意,frombase您的案例中的参数应该是 16 而不是 5,这是因为 UUID 是 32 位十六进制数字。

最后,您可以按原样使用的最大数量tobase36根据手册)。

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

base_convert($yourNumber, 16, 36);

并且转换后的数字长度将超过 4-6 个字符。所以不可能缩小 UUID 并通过使用base_convert().

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

于 2012-11-24T16:19:38.223 回答
1

您是否查看过 PHP 中内置的 uniqid() 函数?我相信它默认返回一个 14 个字符的字符串,并让您能够输入自定义前缀以添加额外的唯一性。

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

于 2012-11-24T16:18:06.870 回答