tsql-从随机文本创建一个guid,然后从该guid获取原始文本值

sdnqo3pr  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(362)

我很好奇,有没有一种有效的方法来产生 GUID 从随机的一串 text 然后拿着它 GUID 并将其转换回 text 不使用任何额外的数据/Map?我四处寻找做这件事的方法,但找不到任何实质性的东西。
以这个变量为例作为起点。我想知道我是否能生成一个 GUID 然后摧毁 GUID 找回原作 @Text ```
DECLARE @Text CHAR(64) = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' ;

6l7fqoea

6l7fqoea1#

你好像倾向于 EncryptByPassPhrase() 以及 DecryptByPassPhrase() 例子

declare @encrypt varbinary(200) 
select @encrypt = EncryptByPassPhrase('MySecretKey', 'abc' )
select @encrypt 

select convert(varchar(100),DecryptByPassPhrase('MySecretKey', @encrypt ))
um6iljoc

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进行往返。如

declare @d varchar(16) = 'hello world'

declare @u uniqueidentifier = cast(cast(@d as varbinary(16)) as uniqueidentifier)

select cast(cast(@u as varbinary(16)) as varchar(16))
3j86kqsm

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个字符。
否则你就需要两边都有字典。。。

相关问题