【问题标题】:converting GUID to long [closed]将 GUID 转换为长 [关闭]
【发布时间】:2011-07-13 04:02:53
【问题描述】:

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

【问题讨论】:

  • 如果需要计数器,为什么要将 GUID 转换为 long?
  • 我不认为我理解这个问题,因为您不需要 GUID。如果您只需要一个计数器,您只需使用long Counter=0;,然后可以在需要使用它时调用long x = Counter; 并调用++Counter 来增加它。你能解释一下为什么需要它作为 GUID 吗?
  • 我们还希望获得一个独特的 uInt64,而无需显式持久化它。

标签: c#


【解决方案1】:

不,GUID 是 128 位的,因此不适合您的 long,因为它是 64 位的。 System.Decimal 是 128 位的,所以会让你走很长一段路,但当然这也有它的限制。即使您将计数器保存在字符串中,它也有其限制。计算机总是有限制的,你必须找到一个足够大的,这样你才能继续使用一段时间。

编辑:

在 .Net 4.0 中有一个 BigInteger 可能非常大,但请记住,即使这样也有其局限性,因为它必须适合内存。

【讨论】:

    【解决方案2】:

    你可以试试这样的。

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

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

    【讨论】:

    • 我确定不是。但这没关系,因为没有提到安全性作为要求
    • 这只是获取数组的开始字节,因此使得结果远不如它所使用的 GUID 唯一!!!!!!!!! (这需要更多的感叹号!)
    • 在您的 GUID 上放置索引很有趣!!!!!!!!!!!!!!!
    【解决方案3】:

    GUID 是一个 128 位整数。 long 是有符号的 64 位整数。而 ulong 的值可以从 0 到 18,446,744,073,709,551,615。够了吗?还是您希望使用小数?

    【讨论】:

    【解决方案4】:

    问题在于 GUID 的集合远远超过了所有整数长精度的集合。所以实际上你正在显着缩小选择的基数。没有充分的理由这样做。

    如果您想不断增加数字而不担心它,有一个库 IntX 可以处理大数字。您可以将数字生成器的本地状态存储在文件或内存中,并且您将拥有越来越多的数字。 (好吧)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多