C# 在.NET中编写T-SQL功能

C# 在.NET中编写T-SQL功能,c#,tsql,C#,Tsql,我有一段t-sql代码 set @UrlHash = convert(bigint, hashbytes('MD5', @Url)) 我想知道我是否可以用C编写一个函数,该函数返回与上面一行完全相同的哈希值,而不必使用SQL 可能吗 要求是C必须创建完全相同的散列。不是MD5散列标准吗?你不能使用标准的MD5C实现吗?使用中的代码怎么样?不是MD5哈希标准吗?你不能使用标准的MD5C实现吗?如何使用中的代码?您应该使用MD5类,以下是中的示例,输出为int 64: public int64

我有一段t-sql代码

set @UrlHash = convert(bigint, hashbytes('MD5', @Url))  
我想知道我是否可以用C编写一个函数,该函数返回与上面一行完全相同的哈希值,而不必使用SQL

可能吗


要求是C必须创建完全相同的散列。

不是MD5散列标准吗?你不能使用标准的MD5C实现吗?使用中的代码怎么样?

不是MD5哈希标准吗?你不能使用标准的MD5C实现吗?如何使用中的代码?

您应该使用MD5类,以下是中的示例,输出为int 64:

public int64 CalculateMD5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);

    return BitConverter.ToInt64(hash, 0);
}

您应该使用MD5类,以下是中的示例,输出为int 64:

public int64 CalculateMD5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);

    return BitConverter.ToInt64(hash, 0);
}
选择

SELECT CONVERT(BIGINT, HASHBYTES('MD5', 'http://stackoverflow.com')) 
将产生以下结果:

-3354682182756996262
如果您现在尝试在C中创建MD5哈希

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 
long numeric = BitConverter.ToInt64(result, 0);
数字为8957512937738269783

那么,除了MD5哈希是128位和BIGINT/long只是64位之外,还有什么问题呢

这是一个字节顺序错误的问题。让我们使用类修复它,并根据需要反转字节:

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 

if (BitConverter.IsLittleEndian)
    Array.Reverse(result);

long numeric = BitConverter.ToInt64(result, 0);
数字现在是-3354682182756996262,如您所需。

选择

SELECT CONVERT(BIGINT, HASHBYTES('MD5', 'http://stackoverflow.com')) 
将产生以下结果:

-3354682182756996262
如果您现在尝试在C中创建MD5哈希

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 
long numeric = BitConverter.ToInt64(result, 0);
数字为8957512937738269783

那么,除了MD5哈希是128位和BIGINT/long只是64位之外,还有什么问题呢

这是一个字节顺序错误的问题。让我们使用类修复它,并根据需要反转字节:

MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash); 

if (BitConverter.IsLittleEndian)
    Array.Reverse(result);

long numeric = BitConverter.ToInt64(result, 0);


numeric现在是-3354682182756996262,这是您想要的。

奇怪的是,MD5哈希是128位,bigint是64位,这是怎么回事?有一个MD5类实现了MD5哈希算法。这听起来像是你要找的。查看System.Security.Cryptography.MD5ok。但是convert bigint那一块呢?即使我从MD5散列中得到一个字节数组。。。convert和bigint工件训练将如何进行?看起来这可能是一个endian问题:奇怪的是,MD5哈希是128位的,而bigint是64位的,这是如何工作的?有一个MD5类实现了MD5哈希算法。这听起来像是你要找的。查看System.Security.Cryptography.MD5ok。但是convert bigint那一块呢?即使我从MD5散列中得到一个字节数组。。。convert和bigint piece训练将如何进行?看起来这可能是endian问题:那么covert功能呢?我们无法将字节[]转换为Int64。我们可以吗?但是如果您传递给代码about而不是ASCII,哈希就不匹配。我使用unicode它生成-5931442742085820074,而t-sql生成-7038863548646352319选择convertbigint,hashbytes'MD5',抱歉,哈希匹配到MD5创建级别。。。但是当我们转换成bigint时。。。在那个时候,数字是不同的。那么隐函数呢?我们无法将字节[]转换为Int64。我们可以吗?但是如果您传递给代码about而不是ASCII,哈希就不匹配。我使用unicode它生成-5931442742085820074,而t-sql生成-7038863548646352319选择convertbigint,hashbytes'MD5',抱歉,哈希匹配到MD5创建级别。。。但是当我们转换成bigint时。。。当时的数字有所不同。我错过了姆贝基什已经找到了一个可能的副本:我错过了姆贝基什已经找到了一个可能的副本: