gpt4 book ai didi

c# - MySql 和 C# 哈希值在转换为 BIGINT 时不匹配

转载 作者:行者123 更新时间:2023-11-29 19:05:44 25 4
gpt4 key购买 nike

我的 MySql 表需要非加密哈希,以便我可以更快地查询数据。 MySql 数据库哈希函数和 C# 应用程序必须为给定值生成相同的哈希值,但前提是我将其保留为字符串。我想将它们转换为 BIGINT,这样我就可以避免字符串比较的开销。我知道 Sha256 是加密哈希函数,但至少 MySql 和 C# 为给定输入生成相同的哈希字符串,我不介意将其用于非加密用途。我尝试过其他在线可用的哈希算法,例如 MurmurHash3 X86,但存在哈希冲突。任何帮助,将不胜感激。谢谢!

MySql查询:

SELECT SHA2('MyString', 256) AS Sha256, CONV(RIGHT(SHA2('MyString',256), 16), 16, 10) AS BIGINT_Sha256, MD5('MyString') AS MD_5, CONV(RIGHT(MD5('MyString'), 16), 16, 10) AS BIGINT_MD5;

C# 代码:

static void Main(string[] args)
{
using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

Console.WriteLine(hash);
}

using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToInt64(hashBytes, 0);

Console.WriteLine(hash);
}

using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

Console.WriteLine(hash);
}

using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToInt64(hashBytes, 0);

Console.WriteLine(hash);
}

Console.ReadLine();
}

MySql 结果:

MySql Result

C# 结果:

enter image description here

最佳答案

这个answer帮助我解决了这个问题。

我没有使用 RIGHT 16 个字符,而是在 MySql 端将其更改为 LEFT。

MySql查询:

SET @Value = 'MyString';
SELECT
SHA2(@Value, 256) AS Sha256,
CAST(CONV(LEFT(SHA2(@Value,256), 16), 16, 10) AS INT) AS BIGINT_Sha256,
MD5(@Value) AS MD_5,
CAST(CONV(LEFT(MD5(@Value), 16), 16, 10) AS INT) AS BIGINT_MD5;

C# 代码:

static void Main(string[] args)
{
var value = "MyString";

using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

Console.WriteLine(hash);
}

using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value));
var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0);
hash = IPAddress.HostToNetworkOrder(hash);

Console.WriteLine(hash);
}

using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

Console.WriteLine(hash);
}

using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0);
hash = IPAddress.HostToNetworkOrder(hash);

Console.WriteLine(hash);
}

Console.ReadLine();
}

MySql 结果:

MySql Result

C# 结果:

C# Result

我将测试超过 3000 万条记录并更新答案。

关于c# - MySql 和 C# 哈希值在转换为 BIGINT 时不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43529736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com