如何在c#中生成8字节的GUID值?

时间:2011-07-19 15:36:47

标签: c# .net asp.net

  

可能重复:
  How to generate 8 bytes unique id from GUID?

我需要一个唯一的密钥来识别通用的用户,密钥的长度只有8个字节,如何在c#中执行此操作?

7 个答案:

答案 0 :(得分:8)

以下代码将生成加密唯一的8个字符串:

 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();
        }   
    }
}

答案 1 :(得分:3)

8个字节是.net中长整数的大小。您可以从零开始,将每个用户增加一个。与地球上的人相比,这将为更多用户生成唯一的密钥。 如果这不能解决您的问题,请告诉我们您的约束。

答案 2 :(得分:2)

生成一个随机的long,然后将其转换为十六进制字符串。

或者,只需从unsigned long顺序分配。

答案 3 :(得分:0)

您可以使用Guid.NewGuid()。ToByteArray()并通过一些散列算法运行它,结果大小为8 Byte(= 64 Bit)。

编辑: 谷歌开发的Hash-Algo返回64位(见http://code.google.com/p/cityhash/),可以在Guid.NewGuid()。ToString()上使用。

答案 4 :(得分:0)

使用8字节值(64位),您将获得2 ^ 64个可能的结果。这是相当多的,但明显少于具有2 ^ 128个可能值的GUID。

你可以做一些简单的事情:

        // 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算法(当前和过去)中提取一些提示,并使用节点ID值或DateTime哈希或其他类似值与随机值组合来填充8个字节中的一些,以降低冲突风险。

仍然存在冲突的可能性,如果你最终使用8字节的伪guID,你应该为处理冲突定义一个进程。

答案 5 :(得分:0)

GUID的要点是“全局”唯一,这意味着任何人提出与其他人已经用于不同对象的相同唯一标识符的可能性必须如此很小,你愿意打赌你的业务。比我更聪明的头脑已经确定16个字节与正确的算法相结合就足以实现这一目标。由于8个字节只给出了16字节可能出现的可能性的一小部分,我不建议使用8字节的GUID。

但是,如果你真的想,你可以这样做:

public struct SmallGuid
{
    byte FirstByte;
    byte SecondByte;
    ...
}

然后你可以为这些字节生成随机值,或者利用 real Guid类,并从中拉出一半的字节来填充你的SmallGuid。

答案 6 :(得分:0)

请参阅GUIDs are globally unique, but substrings of GUIDs aren't

散列GUID 可能工作(但我不确定),但更好的想法是提出自己的算法,灵感来自GUID算法并基于系统的约束你知道的,例如:

  • 如果您知道只会在少数几个系统上生成ID,那么可以缩短GUID的MAC地址部分。
  • 同样,如果您认为您的应用程序将在100年内消失,您可以缩短时间戳部分
  • 如果您只有一个算法,则不需要算法标识符
  • 如果你也知道你不会过快地产生它们,你可以缩短“紧急统一者位”