可能重复:
如何从 GUID 生成8字节的唯一标识符?
我需要一个唯一的键来识别用户,并且该键的长度只有8个字节,我该如何在c#中实现?
可能重复:
如何从 GUID 生成8字节的唯一标识符?
我需要一个唯一的键来识别用户,并且该键的长度只有8个字节,我该如何在c#中实现?
using System;
using System.Security.Cryptography;
using System.Text;
namespace JustForFun
{
public class UniqueId
{
public static string GetUniqueKey()
{
int maxSize = 8;
char[] chars = new char[62];
string a;
a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
chars = a.ToCharArray();
int size = maxSize;
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
size = maxSize;
data = new byte[size];
crypto.GetNonZeroBytes(data);
StringBuilder result = new StringBuilder(size);
foreach (byte b in data)
{ result.Append(chars[b % (chars.Length - 1)]); }
return result.ToString();
}
}
}
chars.Length - 1
。N mod X 的最大值总是 X - 1。 - John Gibb在 .net 中,long integer 的大小为 8 字节。你可以从零开始使用一个密钥,每当用户到来时将其增加一。这将为比地球上的人类更多的用户生成唯一的密钥。
如果这不能解决你的问题,请告诉我们更多关于你的限制。
生成一个随机的长整型数,然后将其转换为十六进制字符串。
或者可以直接从 unsigned long
顺序分配。
使用8字节值(64位),您将拥有2^64个可能的结果。这相当多,但明显少于GUID,后者具有2 ^ 128个可能的值。
您可以做一些简单的事情:
// generate 8 byte random value
Random rnd = new Random();
byte[] bytes = new byte[8];
rnd.NextBytes(bytes);
// displaying the value
string myRndID = BitConverter.ToString(bytes).Replace("-", "");
Console.WriteLine(myRndID);
例如:
XXXX YY ZZ
---- -- --
Random Value Node ID Days since epoch (of your definition)
然后:
Cat XXXX, YY and ZZ bytes together to create your pseudo-guID.
但这种方法仅使用随机数生成。您可以从GUID算法(当前和过去)中获取一些提示,并将其中的某些8个字节填充为节点ID值或DateTime散列之类的内容,再结合随机值以降低发生冲突的风险。
尽管如此,冲突的可能性仍然存在,如果您最终使用8字节伪guID,则应定义处理冲突的流程。
public struct SmallGuid
{
byte FirstByte;
byte SecondByte;
...
}
然后,您可以为这些字节生成随机值,或利用真正的 Guid类,并从中取出一半的字节来填充您的SmallGuid。
哈希GUID可能有效(但我不确定),但更好的想法是根据您所知道的系统约束,受GUID算法启发并基于自己的算法来生成ID,例如: