【发布时间】:2013-03-12 21:02:12
【问题描述】:
我正在尝试创建一个通用散列算法,将字符串散列为 64 位整数。
我能够正确地散列字符串: sql:
select
convert
(
varchar(64),
HASHBYTES
(
'SHA1',
'google.com'
),
2
)
返回BAEA954B95731C68AE6E45BD1E252EB4560CDC45
C#
System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
System.Text.StringBuilder sb = new StringBuilder();
byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
for (int i = 0; i < b.Length;i++ )
{
byte by = b[i];
sb.Append(by.ToString("x2").ToUpper());
}
return sb.ToString();
返回BAEA954B95731C68AE6E45BD1E252EB4560CDC45
但是,当我转换为 bigint/long 时,值不匹配: sql:
select
convert
(
bigint,
HASHBYTES
(
'SHA1',
'google.com'
)
)
返回2172193747348806725
c#:
System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
return BitConverter.ToInt64(b, 0);
返回7501998164347841210
关于如何使这些数字匹配的任何想法?
【问题讨论】:
-
请参阅此处:stackoverflow.com/questions/8467072/… 以获得可能的解决方案。
-
与其在对象上生成自己的哈希值,不如只使用
GetHashCode,它比重新发明轮子更有效,相同字符的字符串将生成相同的"HashCode"。 -
@Killrawr:GetHashCode 只能用于平衡哈希表。我们没有证据表明原始发布者试图平衡哈希表;看起来他们正在尝试加密强度哈希。 永远不要将 GetHashCode 用于加密哈希是非常非常重要的。它有 none 您需要进行安全哈希的属性。同样,如果您正在调用 GetHashCode 而您现在没有尝试平衡哈希表,那么您做错了。
-
@EricLippert 哦,我想我会推荐它,如果哈希被用于其他任何事情,例如使用
Equals方法以便在对象之间创建高效的Contract。跨度>
标签: c# sql-server hash bigint uint64