我正在使用来自cassandra的uuid
生成此utf8字符串:
f6195c60-364e-11e2-b43e-c78503d589ce21rvhf9q21
但我需要将它缩短到4-6个字母之间,经过一些谷歌搜索后我发现了
base_convert($id, 5, 36);
只有这样,但它真的会保持独特吗?
这可能是一个愚蠢的问题,但我需要一些解释。
答案 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中看到的,有一些荒谬的字符,如r
,v
,h
和q
。
我认为这是由错误引起的,并会尝试回答你的问题:
如果您想使用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