如何在C#中生成正整数?
背景信息:我没有共享状态,并且正在将条目插入到没有自动递增主键的dynamodb中。一个典型的模式是插入一个guid,检查碰撞;根据表的占用情况,这是一个有效的解决方案。我想使用一个修改过的策略,而不是使用guids(16字节),我将使用正长(63位)。
证明这是一个安全的计划:
我预计最终将使用最多可用空间的千亿分之一(1/10 ** 8)。
2**63 == 9223372036854775808
如果我存储100b记录,则占用率为:
2**63/10**11 == 92233720 ~= 10**8
这意味着碰撞的几率大约是每一万次尝试。由于我在插入时检测到碰撞,因此必须以该频率重试生成。
所以问题是:
如何在C#中生成随机正数长片?
答案 0 :(得分:1)
问题是如何在C#中生成正数。这段代码就是这样。 该问题概述了处理重复的计划。因此,以下代码不会生成PK,也不会声明唯一性 - 它声称分布良好,并且依赖于概述的框架来处理long。
所以,这里是如何在C#中生成正long,这就是问题所要求的:
public static long GeneratePositiveLong(Random random)
{
byte[] buf = new byte[8];
random.NextBytes(buf);
//the last byte must be from 0-127
buf[7] = buf[7] &= 0x7f;
long res = BitConverter.ToInt64(buf, 0);
return res;
}
答案 1 :(得分:0)
一种可能性是使用表来跟踪下一个用于其他表的PK。当您需要新的主键时,请锁定此表,读取当前值,增加它,然后解锁。这样多个客户端就不会重叠密钥。
答案 2 :(得分:0)
一种可能的解决方案是你可以使用以纳秒为单位的currenttimestamp,它是唯一的,因此你可以将它作为唯一的主键使用