我正在使用uuid
从 cassandra 生成此 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 存储在数据库中,这样你就知道何时发生冲突)。现在您只是希望并尝试交叉手指。
来自卡桑德拉维基:
[...] UUIDs are represented by a 32 digit hexadecimal number in the form of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
正如我在您的示例 UUID 中看到的那样,有一些荒谬的字符,例如r
,和. 我认为这是由错误引起的,并将尝试回答您的问题:v
h
q
如果你想使用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 个字符。所以不可能缩小 UUID 并通过使用base_convert()
.
从技术上讲,如果您将 UUID 假定为十六进制数字并将其转换为基数 128,您将得到 4 个字母长度的结果。
您是否查看过 PHP 中内置的 uniqid() 函数?我相信它默认返回一个 14 个字符的字符串,并让您能够输入自定义前缀以添加额外的唯一性。
您可以在此处找到有关 uniqid() 的更多信息:http: //php.net/manual/en/function.uniqid.php