|
|
1
8
[回应编辑]
|
|
2
16
Raymond Chen 有一篇关于为什么不应该使用“半个guid”的好文章,并提供了一个合适的解决方案来生成自己的“不完全guid,但足够好”类型值: 他的战略(没有具体实施)基于:
|
|
|
3
15
更新(2017年2月4日):
我过去使用的一个有趣的机制是,在内部只使用一个递增的整数/长,但要将该整数“映射”为字母数字“代码”。 例子
代码下面的代码显示了一个简单的类,它将把long更改为“code”(然后再返回!):
} 这基本上是您自己的basex编号系统(其中x是shortcode_keyspace常量中唯一字符的数目)。 要使事情变得不可预测,请从1或0以外的位置开始内部递增编号(即从184723开始),并更改短代码\u keyspace常量中字符的顺序(即使用字母A-Z和数字0-9,但将它们的顺序散放在常量字符串中)。这将有助于使每个代码都有点不可预知。 如果你用这个来“保护”任何东西,这仍然是模糊的安全,如果一个给定的用户能够观察到足够多的这些生成的代码,他们就可以预测一段给定时间内的相关代码。这其中的“安全性”(如果你可以这么叫的话)就是短代码的keyspace常量被置乱了,并且仍然是秘密的。 编辑: 如果您只想生成一个guid,并将其转换为一些仍然是唯一的,但包含较少字符的内容,那么这个小函数将完成以下操作:
|
|
|
4
14
如果您不希望其他用户看到用户信息,为什么不保护您使用的ID页面? 如果这样做,那么使用递增的ID就不重要了。 |
|
5
3
你可以随机生成一个数字。检查这个数字是否已经存在于数据库中并使用它。如果您希望它显示为一个随机字符串,您可以将其转换为十六进制,这样您就可以在其中得到a-f,就像在示例中一样。 |
|
|
6
2
一个guid是128位。如果取这些位,不要使用只有16个字符的字符集来表示它们(16=2^4和128/4=32个字符),而使用64个字符的字符集(如以64为基数),则最终只会得到22个字符(64=2^6和128/6=21.333,即22个字符)。 |
|
|
7
2
带上你的自动增值ID,然后HMAC-SHA1它和一个只有你知道的秘密。这将生成一个随机查找的160位来隐藏真正的增量ID。然后,取一个长度的前缀,使应用程序不太可能发生冲突,比如64位,可以用8个字符编码。用这个做你的绳子。 HMAC将保证没有人可以从显示的位映射回基础数字。通过散列一个自动递增的ID,您可以非常确定它是唯一的。所以发生碰撞的风险来自于sha1中64位部分碰撞的可能性。使用此方法,您可以通过预先生成此方法生成的所有随机字符串(例如,最多可达预期的行数)并进行检查来预先确定是否会发生冲突。 当然,如果您愿意在数据库列上指定一个唯一的条件,那么简单地生成一个完全随机数也可以。你只需要注意随机性的来源。 |
|
|
8
0
你能做的就是当我想要你想要的东西的时候我做的事情。
这是最简单的方法来确保它是模糊和独特的。 |
|
|
9
0
我刚刚有了一个想法,我看到格雷格也指出了这一点。我在会话中使用用户ID存储了该用户。创建查询时,我将使用该用户ID加入到用户表中,如果结果集为空,那么我们知道他正在入侵URL,我可以重定向到错误页。 |
|
|
10
0
guid只是一个数字 最新一代的guid(版本4)基本上是一个大的随机数* 因为它是一个很大的随机数,所以发生碰撞的可能性很小。 使用guid可以获得的最大数量已超过:
因此,如果生成两个guid,则第二个guid与第一个guid相同的可能性是:
如果你生成1000亿个guid。 你的机会 100第十亿 guid与其他9999999999 guid冲突为:
为什么是128位? 一个原因是计算机喜欢使用8位的倍数。 8、16、32、64、128等 另一个原因是,提出guid的人觉得64不够,256太多了。 您需要128位吗? 不,您需要多少位取决于您希望生成多少个数字,以及您希望它们不会发生碰撞。 64位示例 那么第二个数字与第一个数字碰撞的可能性是:
而不是:
那呢? 100第十亿 数字? 您的第100亿个数字与另一个9999999999发生碰撞的可能性是:
而不是:
那么应该使用64位吗? 取决于你是否产生了1000亿个数字?即使你当时是,180000000会让你不舒服吗? 关于guid的更多细节 我专门讲的是第四版。 版本4并没有将所有128位都用于随机数部分,而是使用122位。其他6位用于指示是guid标准的版本4。 此答案中的数字基于122位。 是的,因为它只是一个随机数,你可以从中取你想要的位数。(只需确保您不使用6个永不更改的版本控制位中的任何一个—见上文)。 尽管您可以使用相同的随机数生成器,而不是从guid中获取位,guid从中获取位。 它 可能 使用操作系统附带的随机数生成器。 |
|
|
11
-1
多长时间太长?您可以将guid转换为base 64,这会使它变得更短一些。 |