.net:缩短字符串,将其存储为新字符串,然后';再水化';

.net:缩短字符串,将其存储为新字符串,然后';再水化';,.net,forms-authentication,.net,Forms Authentication,我有一个应用程序,它将每个用户角色作为逗号分隔的字符串存储在表单身份验证票证的userData部分 我们遇到了这样一种情况:用户是许多角色的一部分,而这些角色都有很长的名称。用户数据中最多可以输入#个字符,这可能是cookie的限制 那么,有没有一种低成本的方法可以缩短这根绳子,并在以后“再水化”它呢 不幸的是,票证的userData部分是一个字符串——如果它是一个对象,我可以将其存储为byte[],稍后使用System.Text.Encoding.Unicode.GetString() 我想这

我有一个应用程序,它将每个用户角色作为逗号分隔的字符串存储在表单身份验证票证的userData部分

我们遇到了这样一种情况:用户是许多角色的一部分,而这些角色都有很长的名称。用户数据中最多可以输入#个字符,这可能是cookie的限制

那么,有没有一种低成本的方法可以缩短这根绳子,并在以后“再水化”它呢

不幸的是,票证的userData部分是一个字符串——如果它是一个对象,我可以将其存储为byte[],稍后使用System.Text.Encoding.Unicode.GetString()


我想这真的是一个关于如何缩短字符串、将其存储为字符串并在不丢失其原始值的情况下重新水化的问题。

使用roleId如何?如果设置正确,您可以将它们偶合在一起,形成一个包含所有角色的整数。

那么,字符串压缩

我先看一下System.IO.Compression


这将是我的答案,尽管这可能会影响他的其他代码。假设roleids是互斥的,那么+1位非常适合这种情况。我们使用完全相同的方式“1:12”,其中1代表角色,12代表用户id,它可以持续数年才能通过最大限制。没有更短的方法,因为为了使用压缩,字符串中应该有大量的重复。我不建议向程序中注水。好吧,也许“解压缩”是一个更好的术语!你如何定义“低成本”?等一下。您是否将安全角色以明文形式放入cookie中?如果是这样的话,您可能会遇到比空间不足更大的问题。是的,它们将进入表单身份验证票证。它是加密的。这不是一种不常见的技术。不过,对于短字符串,这听起来成本并不低。+1,我只是对500字节到4096字节(IE中cookie大小的最大值)的文本数据进行了一些任意测试,使用gzip,然后使用base64,但大小仍然减少了%10-%40。不错。你的测试数据看起来像@ScottE的吗?如果只是“a”,那么肯定会产生这些结果FWIW base64增加了开销。我最近看到一篇文章提到这与Azure队列的“8KB”限制有关,但实际上更接近6KB,因为他们将字符串转换为base64。