2011-07-12 102 views
0

我需要在C#中开发一个不断增加的计数器。我正在考虑将GUID转换为long。在c#中可能吗?有没有其他的方式来开发一个越来越多的计数器?转换GUID为长

+0

为什么要将GUID转换为long,如果您需要计数器? – Tigran

+9

我不认为我理解这个问题,因为你不需要这个GUID。如果你只需要一个计数器,你只需要使用'long Counter = 0;'然后可以调用'long x = Counter;'当你需要使用它和'++ Counter'来增加它。你能澄清为什么你需要它作为一个GUID? – shelleybutterfly

+1

无论如何,谁在统计GUID? – BoltClock

回答

12

不,GUID是128位,所以不会适合你,因为这是64位。一个System.Decimal是128位,所以会给你一个很长的路,但当然也有它的限制。即使你将计数器保存在一个字符串中,它也有其局限性。计算机也有限制,你必须找到一个足够大的系统,以便你可以继续一段时间。

编辑:

在.NET 4.0中有一个BigInteger它可以是相当大的,但要记住,即使是有其局限性,因为它必须适合在内存中。

9

你可以尝试这样的事情。

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

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

我不知道如果它是非常安全的。 :p

+0

我确定它不是。但这并不重要,因为没有提到安全性,因为要求没有提及 – sehe

+3

只需要数组的起始字节,从而使得结果*远远不像它所馈送的GUID那样唯一* !!!!!! ! (这需要更多的感叹号!) –

+0

把你的GUID索引放在一起吧!!!!!!!!!!!!!! – DeadlyChambers

1

问题是,远远超过了所有整数集长精度的GUID集。所以你真的正在缩小选择的基数。没有理由这样做。

如果你想继续增加一个数字而不用担心,有一个库IntX处理大数字。您可以将您的号码生成器的本地状态存储在文件或内存中,并且您的号码将不断增加。 (以及排序)

3

GUID是一个128位整数。长整型是一个有符号的64位整数。而ulong的值可以是0到18,446,744,073,709,551,615。够了吗?或者你想使用小数?

+0

[__m128i](http://msdn.microsoft.com/en-us/library/26232t5c.aspx)... – sehe