2012-05-14 36 views
2

我想为我网站上的每个使用者建立一个公开个人档案页面。与SO用户配置文件非常相似。但我不想暴露我用作PK的Guid。我也不知道在网站的整个生命周期中用户名是如何独特的,以便在网址中使用它。公开个人档案的公开个人档案

问题是SO本身是如何做到这一点在url https://stackoverflow.com/users/242506/nubm?用户名可以删除,网址仍然有效,但是我应该在我的Guid旁边生成一些可公开查看的UserId,我可以在链接到个人资料页面并在url中显示它?

我找到了类似的问题Should I expose a user ID to public?How do I create a "public" user profile page in ASP.NET (3.5)但他们不完全是我想知道的。

+2

SO只是使用用户标识 - 也就是说,它们存储的是整数而不是GUID。 –

回答

2

你可以做两件事。

首先,您可以在数据库上创建额外的增量ID,无论是在ASP.NET表格还是新的映射表格上,并且给Guid连接一个较小的数字。为什么是更小的数字?由于Guid是128位,并且太大而无法使用,因为它在url上。

然后,你可以使用这个较小的数字,它与URL上的Guid连接。这里唯一的漏洞问题是任何人都可以找到你的用户的所有列表。如果你有他们也是公开的,所以这个公众不是问题。所以在他们的URL中使用这个数字来找到用户,而用户名是为了更好的搜索引擎优化。号码保持不变,但名称可以更改,因此只有号码用于定位用户。

第二种解决方案是将128位Guid号码压缩并编码为73个基本字符的字符串。我选择了73个基本字符,因为73是url上允许的非转义字符。

下面是一些例子,我发现了使这个转换:

http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx

http://jopinblog.wordpress.com/2009/02/04/a-shorter-friendlier-guiduuid-in-net/

http://buildmaestro.wordpress.com/2011/04/27/installscript-to-transform-guid-into-compressed-guid/

一个简单的转换为base64(从Dave Transoms

public static string Encode(Guid guid) 
{ 
    string encoded = Convert.ToBase64String(guid.ToByteArray()); 
    encoded = encoded 
    .Replace("/", "_") 
    .Replace("+", "-"); 
    return encoded.Substring(0, 22); 
} 

public static Guid Decode(string value) 
{ 
    value = value 
    .Replace("_", "/") 
    .Replace("-", "+"); 
    byte[] buffer = Convert.FromBase64String(value + "=="); 
    return new Guid(buffer); 
} 
1

在SO的情况下,使用PK。网址的用户名部分是可选的,并被忽略。