Я пытаюсь создать универсальный хэширующий алогритим, который хэширует строку как 64-битный int.SQL bigint хэш для соответствия C# int64 hash
Я способен правильно хэш строки: 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();
Retruns BAEA954B95731C68AE6E45BD1E252EB4560CDC45
Однако, когда я конвертировать в BIGINT/с нг значения не совпадают: 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
Любые идеи о том, как получить эти цифры, чтобы соответствовать?
Смотрите здесь: http://stackoverflow.com/questions/8467072/sql-server-varbinary-bigint-with-bitconverter-toint64-values-are-different для возможное решение. –
Вместо того, чтобы генерировать собственные хэши на объектах, вы должны просто использовать ['GetHashCode'] (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx), что намного эффективнее, чем переосмысление колесо, строки с одинаковыми символами будут выдавать один и тот же «HashCode». – Killrawr
@Killrawr: GetHashCode следует использовать только для балансировки хеш-таблицы. У нас нет доказательств того, что оригинальный плакат пытается сбалансировать хэш-таблицу; это похоже на то, что они пытаются использовать криптопрочность. Очень важно очень никогда не использовать GetHashCode ** для криптографического хэша. Он имеет * none * свойств, необходимых для создания безопасного хэша. Опять же, если вы вызываете GetHashCode, и вы сейчас не пытаетесь сбалансировать хеш-таблицу, вы делаете что-то неправильно. –