如何在C#中生成正整数?

时间:2018-01-26 20:12:34

标签: c# random

如何在C#中生成正整数?

背景信息:我没有共享状态,并且正在将条目插入到没有自动递增主键的dynamodb中。一个典型的模式是插入一个guid,检查碰撞;根据表的占用情况,这是一个有效的解决方案。我想使用一个修改过的策略,而不是使用guids(16字节),我将使用正长(63位)。

证明这是一个安全的计划:

我预计最终将使用最多可用空间的千亿分之一(1/10 ** 8)。

2**63 == 9223372036854775808

如果我存储100b记录,则占用率为:

2**63/10**11 == 92233720 ~= 10**8

这意味着碰撞的几率大约是每一万次尝试。由于我在插入时检测到碰撞,因此必须以该频率重试生成。

所以问题是:

如何在C#中生成随机正数长片?

3 个答案:

答案 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,它是唯一的,因此你可以将它作为唯一的主键使用