我使用的是来自cassandra的uuid,它生成这个utf8字符串:
f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21
但我需要把它缩短到4-6个字母之间,在谷歌上搜索后,我发现了
base_convert($id, 5, 36);
它确实做到了这一点,但它真的会保持独特吗?
这可能是一个愚蠢的问题,但我需要一些解释。
发布于 2012-11-25 00:19:38
来自Cassandra Wiki:
[...] 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,这是因为UUIDs是32位的十六进制数字。
最后,您可以用作tobase的最大数量是36 (根据manual)。
所以你能做的最好的事情是:
base_convert($yourNumber, 16, 36);并且转换后的数字长度将超过4-6个字符。因此,不可能通过使用base_convert()来缩小UUID并保持唯一的编号。
从技术上讲,如果您假设UUID是一个十六进制数字,并将其转换为基数128,您将得到一个4个字母的长度结果。
发布于 2012-11-25 00:03:22
这不是utf8字符串。UTF8是字符编码,UUID甚至完全适合7位编码。base_convert()将不起作用,因为UUID不是一个数字(至少由于-)。不,把它缩短到4个字母并不会让它变得更好。假设您使用0-9,而a-z只给出36!4个组合,因此很可能发生冲突(谁知道您是如何生成该ID的,以及生成该ID的频率如何)。通常-如果你想唯一-使它唯一(比如在DB中存储已经生成的ID,这样你就可以知道什么时候发生冲突)。现在你只是希望并试着祈祷。
发布于 2012-11-25 00:18:07
你有没有研究过PHP内置的uniqid()函数?我相信它默认返回一个14个字符的字符串,并允许您输入自定义前缀以添加额外的唯一性。
你可以在这里找到更多关于uniqid()的信息:http://php.net/manual/en/function.uniqid.php
https://stackoverflow.com/questions/13542818
复制相似问题