c# - DB ID 需要一个更小的 GUID 替代品,但 URL 仍然是唯一且随机的

标签 c# asp.net database url

我找遍了所有地方,但似乎无法得到完整的答案。因此,如果答案已经存在于 stackoverflow 上,那么我提前道歉。

我想要一个唯一且随机的 ID,这样我网站上的用户就无法猜测下一个数字,而只能跳转到其他人的信息。我计划坚持使用递增 ID 作为主键,但也为数据库中的该行存储一个随机且唯一的 ID(某种哈希),并在其上放置一个索引。

通过搜索,我意识到我想避免冲突,并且我已经阅读了一些关于 SHA1 的内容。

我的基本要求是

  • 比 GUID 小的东西。 (在 URL 中看起来很糟糕)
  • 必须是唯一的
  • 避免碰撞
  • 不是一长串不可读的奇怪字符。

我正在寻找的一个例子是 www.somesite.com/page.aspx?id=AF78FEB

我不确定我是否应该在数据库(我使用的是 SQL Server 2005)或代码(我使用的是 C# ASP.Net)中实现它

编辑:

从我所做的所有阅读中,我意识到这是通过默默无闻实现的安全。我确实打算获得适当的授权和身份验证来访问这些页面。我将使用.Net 的身份验证和授权框架。但是,一旦合法用户登录并访问合法(但动态创建的页面),其中包含指向属于他的项目的链接。例如,链接可能是 www.site.com/page.aspx?item_id=123。是什么阻止他点击该链接,然后将上面的 URL 更改为不属于他的 www.site.com/page.aspx?item_id=456?我知道一些 Java 技术,如 Struts(我有待更正)将所有内容存储在 session 中并以某种方式从中计算出来,但我不知道这是如何完成的。

最佳答案

Raymond Chen有一篇关于为什么你不应该使用“half a guid”的好文章,并提供了一个合适的解决方案来生成你自己的“不是很 guid 但足够好”类型值:

GUIDs are globally unique, but substrings of GUIDs aren't

他的策略(没有具体实现)基于:

  • Four bits to encode the computer number,
  • 56 位的时间戳,以及
  • 四位作为唯一标识符。

We can reduce the number of bits to make the computer unique since the number of computers in the cluster is bounded, and we can reduce the number of bits in the timestamp by assuming that the program won’t be in service 200 years from now.

You can get away with a four-bit uniquifier by assuming that the clock won’t drift more than an hour out of skew (say) and that the clock won’t reset more than sixteen times per hour.

关于c# - DB ID 需要一个更小的 GUID 替代品,但 URL 仍然是唯一且随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529647/

相关文章:

mysql - UPDATE row ON UPDATE 触发器,多表条件

c# - MVC4 复杂类型模型在发布后为空

mysql - 如何制作多级MySQL触发器

ruby-on-rails - 在 rails 中建模嵌套模型

c# - 在 Vs 2003 IDE 中查看数据集内容的最佳方式是什么

asp.net - 服务器端检测页面显示在 IFrame 中

c# - 将 'hd' 参数附加到 redirectUrl ASP.NET Core 1 with Identity 3

c# - 一个mysql连接适用于C#中的所有表单

c# - 如何在 gridview 中使用 LinkBut​​ton 删除代码隐藏文件中的选定用户名?

c# - Signalr - 重写发送消息的方法