当前位置: 首页 > 知识库问答 >
问题:

如何从阿沙1字节数组生成Guid?

丁曦
2023-03-14

我有生成SHA-1哈希的代码:

SHA1 sha1 = SHA1CryptoServiceProvider.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = sha1.ComputeHash(myStringBytes);

有没有办法将< code>hash转换成Guid(我猜是type 5,以便与SHA-1保持一致)?

共有2个答案

阎建中
2023-03-14

正如Justin所指出的,Guid每次都应该是唯一的,而哈希每次都会为相同的值提供一致的结果。

现在我想补充一点,并说Guids和哈希(大多数,如果不是所有算法)都会受到冲突的影响,尽管我的直觉是哈希比Guids受到更大程度的冲突……尽管这可能会受到哈希大小的影响(即128位、256位、512位等)。

您将遇到的另一个问题是,SHA1哈希中的byte[]长度为20字节,而Guid长度为16字节,因此,从SHA1哈希创建Guid将不准确。

例:

string myString = "Hello World";
SHA1 sha1 = SHA1CryptoServiceProvider.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = sha1.ComputeHash(myStringBytes);
Console.WriteLine(new Guid(hash.Take(16).ToArray()));

上面的示例将从哈希中创建一个Guid,尽管它使用LINQ从哈希数组中获取16个字节(因此不准确……最后4个字节被简单省略)

MD5是一个16字节的哈希,因此它似乎比SHA1更适合转换为Guid。

例:

string myString = "Hello World";
MD5 md5 = MD5.Create();
Byte[] myStringBytes = ASCIIEncoding.Default.GetBytes(myString);
Byte[] hash = md5.ComputeHash(myStringBytes);
Console.WriteLine(new Guid(hash));

这会从MD5哈希生成准确的Guid,尽管我将声明,所有这些都是MD5哈希的Guid表示…byte[]数据不应该有实际更改。

马绪
2023-03-14

您可以使用基于rfc4122的C#代码。

为了防止链接腐烂,这里有一些代码:

public static Guid Create(Guid namespaceId, string name)
{
    if (name == null)
        throw new ArgumentNullException("name");

    // convert the name to a sequence of octets (as defined by the standard or conventions of its namespace) (step 3)
    // ASSUME: UTF-8 encoding is always appropriate
    byte[] nameBytes = Encoding.UTF8.GetBytes(name);

    // convert the namespace UUID to network order (step 3)
    byte[] namespaceBytes = namespaceId.ToByteArray();
    SwapByteOrder(namespaceBytes);

    // comput the hash of the name space ID concatenated with the name (step 4)
    byte[] hash;
    using (HashAlgorithm algorithm =  SHA1.Create())
    {
        algorithm.TransformBlock(namespaceBytes, 0, namespaceBytes.Length, null, 0);
        algorithm.TransformFinalBlock(nameBytes, 0, nameBytes.Length);
        hash = algorithm.Hash;
    }

    // most bytes from the hash are copied straight to the bytes of the new GUID (steps 5-7, 9, 11-12)
    byte[] newGuid = new byte[16];
    Array.Copy(hash, 0, newGuid, 0, 16);

    // set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3 (step 8)
    newGuid[6] = (byte)((newGuid[6] & 0x0F) | (5 << 4));

    // set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively (step 10)
    newGuid[8] = (byte)((newGuid[8] & 0x3F) | 0x80);

    // convert the resulting UUID to local byte order (step 13)
    SwapByteOrder(newGuid);
    return new Guid(newGuid);
}

/// <summary>
/// The namespace for fully-qualified domain names (from RFC 4122, Appendix C).
/// </summary>
public static readonly Guid DnsNamespace = new Guid("6ba7b810-9dad-11d1-80b4-00c04fd430c8");

/// <summary>
/// The namespace for URLs (from RFC 4122, Appendix C).
/// </summary>
public static readonly Guid UrlNamespace = new Guid("6ba7b811-9dad-11d1-80b4-00c04fd430c8");

/// <summary>
/// The namespace for ISO OIDs (from RFC 4122, Appendix C).
/// </summary>
public static readonly Guid IsoOidNamespace = new Guid("6ba7b812-9dad-11d1-80b4-00c04fd430c8");

// Converts a GUID (expressed as a byte array) to/from network order (MSB-first).
internal static void SwapByteOrder(byte[] guid)
{
    SwapBytes(guid, 0, 3);
    SwapBytes(guid, 1, 2);
    SwapBytes(guid, 4, 5);
    SwapBytes(guid, 6, 7);
}

private static void SwapBytes(byte[] guid, int left, int right)
{
    byte temp = guid[left];
    guid[left] = guid[right];
    guid[right] = temp;
}
 类似资料:
  • 我正在尝试从ODT模板文件生成一个PDF,其中包含我需要填充的字段。 我想获得这个ODT模板的字节数组,它存在于我的项目的根文件夹中。我的应用程序是以这样一种方式提供字节数组来生成PDF。

  • 问题内容: 首先,对英语不好对不起。 好吧,我想从torrent文件中读取散列信息。目前,我正在使用https://github.com/hyPiRion/java- bencode 这个bencode库来解码信息,但是我的问题是当我想将字符串转换为字节数组时。种子文件使用UTF-8编码。但是如果我这样做 很好。任何真正有用的东西。 另一方面,为了比较或尝试获取字符串,而不是获取字节,我已经阅读了

  • 我从这里使用解决方案: 问题是当我这样做时: 我得到一个非常奇怪的字符串,类似于,但我想要一个可以保存在DB中的普通字符串。我错在哪里?

  • 我使用以下类型生成Web服务响应类: 它生成一个具有保护长删除的类; 但是我想生成一个数组。添加minOccurs="0"maxOccurs="unbed"会生成List。 请帮忙。

  • 我被指派提示用户给出一个幻方的顺序(一个3阶的幻方将是一个3x3矩阵),然后生成一个该顺序的幻方,而不使用二维数组。 以下是我所知道和理解的: null 以下是我得到但不明白如何正确实现的内容: > row=order-1,col=order/2和i=1 重复以下步骤,直到i=订单^2+1: (a)魔力[指数]=i

  • 问题内容: 我想从numpy中的2D数组创建“心率监视器”效果,并希望音调能够反映数组中的值。 问题答案: 您可以使用from函数来创建一个wav文件,然后您可以根据需要播放该文件。请注意,数组必须是整数,因此,如果您有浮点数,则可能需要适当地缩放它们: 如果您希望Python实际播放音频,则此页面概述了某些软件包/模块。