我很好奇,有没有一种有效的方法来产生 GUID
从随机的一串 text
然后拿着它 GUID
并将其转换回 text
不使用任何额外的数据/Map?我四处寻找做这件事的方法,但找不到任何实质性的东西。
以这个变量为例作为起点。我想知道我是否能生成一个 GUID
然后摧毁 GUID
找回原作 @Text
```
DECLARE @Text CHAR(64) = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' ;
3条答案
按热度按时间6l7fqoea1#
你好像倾向于
EncryptByPassPhrase()
以及DecryptByPassPhrase()
例子um6iljoc2#
在sql server中,唯一标识符可以是任何16字节的数据。每:
xx-x-x-x-x-形式的字符串常量,其中每个x是范围为0-9或a-f的十六进制数字。例如,6f9619ff-8b86-d011-b42d-00c04fc964ff是有效的唯一标识符值。
https://docs.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-ver15
因此,任何16个字符或更少的varchar都可以通过uniqueidentifier进行往返。如
3j86kqsm3#
要添加一些总体想法:
正如已经告诉您的,guid的长度是16字节。
假设你可以把你的字符串简化成普通的拉丁小写字符,你必须处理26个,以及36个不同值的数字(不包括任何点、逗号或问号等)。
位的计数反映了可能值的数量。8位的一个字节可以表示256(2^8)个不同的值。对于26个字母,您至少需要5位(2^5=32),数字必须增加到6位(64个值)。16字节的guid表示128位(16x8=128)。你可以把它除以5(~25)或6(~21)。
这意味着:减少到26个纯拉丁字符,您可以(花相当多的精力)在一个guid分配的内存中编码多达25个字符(通过使用5位的块)。加上数字,长度限制为21。
如果你想处理任何
VARCHAR
值(它是扩展的ascii),您可以将字符串转换为二进制,然后转换为guid并轻松返回(david brown在他的回答中说明了这一点),只要您将其长度限制为16个字符。否则你就需要两边都有字典。。。