C# 更改 GUID 的前 32 位 Int

C# change the first 32bit Int of a GUID

我有一个 GUID 是我用 GUID.NewGUID() 创建的。现在我想用特定的 32 位整数替换它的前 32 位,同时保持其余部分不变。
有执行此操作的功能吗?

您可以使用 ToByteArray() 函数,然后使用 Guid 构造函数。

byte[] buffer = Guid.NewGuid().ToByteArray();
buffer[0] = 0;
buffer[1] = 0;
buffer[2] = 0;
buffer[3] = 0;

Guid guid = new Guid(buffer);

因为 Guid 结构有一个构造函数,它接受一个字节数组并且可以 return 它的当前字节,它实际上很容易:

//Create a random, new guid
Guid guid = Guid.NewGuid();
Console.WriteLine(guid);

//The original bytes
byte[] guidBytes = guid.ToByteArray();
//Your custom bytes
byte[] first4Bytes = BitConverter.GetBytes((UInt32) 0815);

//Overwrite the first 4 Bytes
Array.Copy(first4Bytes, guidBytes, 4);

//Create new guid based on current values
Guid guid2 = new Guid(guidBytes);
Console.WriteLine(guid2);

Fiddle


但是请记住,从 BitConverter 编辑的字节顺序 return 取决于您的处理器架构 (BitConverter.IsLittleEndian) 并且您的 Guid 的熵减少 232 如果你每次都使用相同的数字(这取决于你的应用程序可能并不像听起来那么糟糕,因为你有 2128 ).

问题是替换位,但是如果有人想直接替换guid的第一个字符,这可以通过将其转换为字符串,替换字符串中的字符并转换回来来完成。请注意,替换字符应以十六进制形式有效,即数字 0 - 9 或字母 a - f.

var uniqueGuid = Guid.NewGuid();
var uniqueGuidStr = "1234" + uniqueGuid.ToString().Substring(4);
var modifiedUniqueGuid = Guid.Parse(uniqueGuidStr);