这涉及到这个问题.我正在使用此答案在JavaScript中生成UUID:
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎工作正常,但我遇到了冲突.这就是我所拥有的:
所以问题是:
在MSDN中,您可以阅读:
新Guid的值全部为零或等于任何其他Guid的可能性非常低.
假设您有一个每秒都会创建一个文件的方法,并且您使用该方法
Guid.NewGuid()的文件名,是否可以获得相同的Guid呢?或者本地计算机会以某种方式跟踪?机会有多低?
我想在.NET中创建一个加密安全的GUID(v4).
.NET的Guid.NewGuid()功能不是加密安全的,但.NET确实提供了System.Security.Cryptography.RNGCryptoServiceProvider类.
我希望能够将随机数函数作为委托Guid.NewGuid传递给(或者甚至传递一些提供生成器接口的类),但它看起来并不像默认实现那样.
我可以创建通过使用密码安全GUID System.GUID和System.Security.Cryptography.RNGCryptoServiceProvider在一起?
我无法为自己想象一个好的答案,所以我想在这里问一下.在我看来,我总是想知道如果AUTO INCREMENT PRIMARY ID我的MySQL表中的列用尽了会发生什么?
比方说,我有一个有两列的表.的ID(auto increment, primary, BIGINT unsigned)和DESC(VARCHAR 255).我肯定知道BIGINT很多,但它可以达到极限.如何处理场景,其中的情况下,该ID达到它的极限?我需要另一台服务器吗?如果那么我该怎么同步呢?这是正确的方法吗?任何见解的朋友.
我正在开发一个项目,我需要生成大约10亿个GUID.
我知道GUID不能保证是唯一的,但几乎在所有时间都是独一无二的.
如果我生成了十亿个GUID,那么匹配的概率是多少?
我一直处于这种困境中一段时间,但是找不到任何提示,尽管似乎有人已经做到了。
我需要的是用加密的安全(即非连续!)ID替换顺序的AUTO_INCREMENT(或等效的)主键,但与此同时,我想保留顺序PK的性能优势:保证未使用的下一个ID,可集群性等。
一种简单的方法似乎实现了一种加密伪随机排列生成器,以将2 ^ N空间唯一地映射到2 ^ N,而不会发生冲突并且具有初始化矢量(IV)。
尽管可以在外部实现,但这确实需要存储和原子访问状态(排列位置或最后一个ID),这意味着从外部实现效率极低(这相当于UPDATE table SET crypto_id = FN_CRYPTO(autoincrement_id) WHERE autoincrement_id=LAST_INSERT_ID()为每个都运行后续操作INSERT)。
您是否知道在商业用途的数据库中有上述任何上述实现?
您好我想使用以下语句生成一个唯一随机数:
Convert(int, (CHECKSUM(NEWID()))*100000) AS [ITEM]
Run Code Online (Sandbox Code Playgroud)
因为当我在"from"上使用连接子句时,它会使用NEWID()生成双重寄存器
我使用的是SQL Server 2000
*PD:当我使用Rand()时,它可能会重复1次100,000的概率,但这是非常重要的,所以它必须是重复生成的随机值的概率的0%
我的带有NewID()的查询和SELECT语句的结果是重复的(x2)我的QUery没有NewID()并且在SELECT语句中使用Rand()是单个(x1)但重复生成的随机值的概率是不确定的但存在!
谢谢!
我理解在SQL Server中GUID是最独特的,并且碰撞的可能性很小,但同时有人必须赢得彩票,所以我觉得为这种可能性做准备是有道理的.
这是更快/更好的做法
使用一种技术,我只需插入一行并检查错误(@@ ERROR <> 0)直接分配一个新的GUID,然后重复直到我没有得到错误[我认为理论上最坏的只是一次...]
或使用这样的方法
DECLARE @MyGUID uniqueidentifier
SELECT @MyGUID = NewID()
if exists(select * from tablename where UserID=@MyGUID)
Run Code Online (Sandbox Code Playgroud)
并循环,直到我发现一个没有使用.
我喜欢第二种方法,因为我可以在后面的存储过程中使用GUID,所以我现在倾向于那个.
我在这里找到问题:
答案提供了以下JS:
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
Run Code Online (Sandbox Code Playgroud)
现在,这对我来说似乎有些愚蠢。为什么要这么重复?我计划使用此名称来命名要上传到服务器的文件,以使它们不会彼此覆盖。看起来它不会总是生成一个唯一的数字。
上面的代码有什么好处呢math.random()?它甚至不会改变种子。
抱歉,我从来没有使用过GUID / UUID,并且某些代码对我来说真的没有任何意义...
澄清说明
很多人没有像我问的那样回答这个问题。很多人在解释GUID并不总是唯一的,等等等等。那不是我要的 我在问,在just上使用它有什么意义math.random()?
乔在评论中似乎为我提供了最佳答案。
我已经看过GUID Collisons的 讨论,但是如果两个客户端都在同一时间访问同一个生成GUID的网页(可能只有微秒),那么您是否想要了解是否存在GUID冲突?
guid ×5
sql ×3
.net ×2
c# ×2
javascript ×2
random ×2
sql-server ×2
t-sql ×2
uuid ×2
asp.net ×1
collision ×1
cryptography ×1
database ×1
mysql ×1
postgresql ×1
security ×1