将GUID转换为长整型

4

我需要在C#中开发一个递增的计数器。我考虑将GUID转换为long类型,这在C#中是否可行?还有其他方法可以开发递增计数器吗?


如果你需要一个计数器,为什么要将GUID转换为长整型? - Tigran
9
我不确定我是否理解了这个问题,因为你不需要一个GUID。如果你只需要一个计数器,你可以使用 long Counter=0;,然后在需要使用它时调用 long x = Counter;,使用 ++Counter 来递增它。请问为什么你需要它作为GUID? - shelleybutterfly
1
可能是重复的问题:如何将Long转换为Guid,反之亦然? - user195488
我们还希望获得一个独特的uInt64,而不需要显式地持久化它。 - Zapnologica
4个回答

17
不,GUID是128位的,所以无法适应您的long,因为它只有64位。System.Decimal是128位的,所以可以让你走得更远,但当然它也有自己的限制。即使你把计数器保存在一个字符串中,它也有自己的限制。计算机总是有限制的,你必须找到一个足够大的限制,这样你就可以继续一段时间了。
编辑:
在.Net 4.0中有一个BigInteger,它可以很大,但请记住,即使它要适应内存,它也有自己的限制。

14

你可以尝试像这样做。

byte[] gb = Guid.NewGuid().ToByteArray();
int i = BitConverter.ToInt32(gb,0);

long l = BitConverter.ToInt64(gb,0);

我不确定它是否非常安全。 :p


我相信这不是必须的。但是这并不重要,因为安全性并没有被提及作为需求。 - sehe
8
只取数组的开始字节,因此使得结果远远不如输入的GUID那样独特!!!!!!(这需要更多感叹号!) - Ray
2
尝试在你的 GUID 上建立索引,享受乐趣吧!!!!!! - DeadlyChambers

4

GUID是一个128位整数。long是一个有符号的64位整数。而ulong可以拥有从0到18,446,744,073,709,551,615的值。这足够了吗?或者你希望使用十进制数吗?


__m128i - sehe

2
问题在于GUID的集合数量远远超过了所有长精度整数的集合。所以你实际上显著地缩小了可选项的基数。没有任何好的理由这样做。
如果你想继续增加一个数字而不用担心它,有一个库IntX可以处理大数。你可以将数字生成器的本地状态存储在文件或内存中,然后就会有一个逐渐增加的数字(当然有点儿意思)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接