将int转换为加扰的Guid并返回

时间:2018-07-09 11:35:41

标签: c# guid

我正在寻找一种将int转换为Guid的方法,但没有将下一个转换为下一个的方法。例如,我有这个:

static void Main(string[] args)
{
   var a = Int2Guid(1);
   var b = Int2Guid(2);
}

public static Guid Int2Guid(int value)
{
    byte[] bytes = new byte[16];
    BitConverter.GetBytes(value).CopyTo(bytes, 0);
    return new Guid(bytes);
}

public static int Guid2Int(Guid value)
{
    byte[] b = value.ToByteArray();
    int bint = BitConverter.ToInt32(b, 0);
    return bint;
}

这可行,但是我不希望数字是连续的,也不是连续的。从上面的示例中,我得到a = {00000001-0000-0000-0000-000000000000},但得到b = {00000002-0000-0000-0000-000000000000}。我想要类似{48204b95-9cbb-4295-a6b1-cf05ebda9d0d}的东西。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果Guid需要4个整数或16个字节,则应输入4个整数或16个字节。

我使Int2Guid输入4整数。

    public static Guid Int2Guid(int value, int value1, int value2, int value3)
    {
        byte[] bytes = new byte[16];
        BitConverter.GetBytes(value).CopyTo(bytes, 0);
        BitConverter.GetBytes(value1).CopyTo(bytes, 4);
        BitConverter.GetBytes(value2).CopyTo(bytes, 8);
        BitConverter.GetBytes(value3).CopyTo(bytes, 12);
        return new Guid(bytes);
    }

然后我将Guid2Int输出到int数组。

    public static int[] Guid2Int(Guid value)
    {
        byte[] b = value.ToByteArray();
        int bint = BitConverter.ToInt32(b, 0);
        var bint1 = BitConverter.ToInt32(b, 4);
        var bint2 = BitConverter.ToInt32(b, 8);
        var bint3 = BitConverter.ToInt32(b, 12);
        return new[] {bint, bint1, bint2, bint3};
    }

当我将Guid设置为Int2Guid并将其设置为Guid2Int时,它可以返回到原点。

    static void Main(string[] args)
    {
        var guid = Guid.NewGuid();
        var foo = Guid2Int(guid);

        var a = Int2Guid(foo[0], foo[1], foo[2], foo[3]);

        Console.WriteLine(a == guid); //true
    }

我不知道你是否需要它。

答案 1 :(得分:1)

有一个不错的解决方案,使用AES ECB模式加密Guid,适用于16字节(您在示例中提供的内容:

 public class EncryptGUI
    {
        private Aes aes;

        public EncryptGUI (byte[] key)
        {
            aes = Aes.Create ();
            aes.Mode = CipherMode.ECB;
            aes.Padding = PaddingMode.None;
            aes.Key = key;
        }

        public String encryptUID (byte[] guid)
        {
            ICryptoTransform aesDecryptor = aes.CreateDecryptor ();
            byte[] result = aesDecryptor.TransformFinalBlock (guid, 0, guid.Length);
            return ToHex (result);
        }

        public static string ToHex (byte[] data)
        {
            StringBuilder hex = new StringBuilder (data.Length * 2);
            foreach (byte b in data)
                hex.AppendFormat ("{0:x2}", b);
            return hex.ToString ();
        }

        public static void Main (string[] args)
        {
            byte[] key = new byte[16];
            EncryptGUI main = new EncryptGUI (key);

            byte[] guid = new byte[16];
            Console.Out.WriteLine (main.encryptUID (guid));
        }
    }

请注意,ECB不使用IV,这意味着您可以将不同的GUID彼此区分开(因为每个GUID都将精确映射到一个密文)。但是密文在其他方面应与使用的分组密文和密钥的安全性完全相同。

答案 2 :(得分:-1)

您可以通过使用MD5对整数进行哈希处理并将哈希作为Guid的来源来实现此目标:

int max = 10;
for (int i = 1; i < max + 1; i++)
{
    MD5 md5 = MD5.Create();
    Byte[] intBytes = BitConverter.GetBytes(i);
    Byte[] hash = md5.ComputeHash(intBytes);
    Console.WriteLine(new Guid(hash));
}

请注意,这不是加密安全的方法。