回答
您可以散列輸入的8k(或4k或2k)塊,然後連接這些散列或將它們散列爲新的散列值。這可能會很困難,但是如果您必須創建一個類似的算法(例如在外部.NET應用程序中)來比較在SQL Server之外創建的哈希值。
另一種選擇:依靠SQL Server的CLR integration並在.NET程序集中執行散列。
與Paul的想法一樣,想到分塊的想法之一是將散列的字符串存儲在XML列中,並將每個塊存儲爲單獨的XML元素。
+1好主意,但爲了數據完整性,我建議存儲一個散列值(哈希散列)。使用XML結構,您需要一個額外的屬性,將散列值映射到第N個塊的索引散列的數據。 –
你可以寫一個SQL CLR函數:
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBinary BigHashBytes(SqlString algorithm, SqlString data)
{
var algo = HashAlgorithm.Create(algorithm.Value);
var bytes = Encoding.UTF8.GetBytes(data.Value);
return new SqlBinary(algo.ComputeHash(bytes));
}
然後它可以在SQL這樣調用:
--these return the same value
select HASHBYTES('md5', 'test stuff')
select dbo.BigHashBytes('md5', 'test stuff')
的BigHashBytes
是唯一必要的,如果長度將超過8K。
小心CLR SP參數被無聲地截斷爲8000字節 - 我必須用'[SqlFacet(MaxSize = -1)]'標記參數,否則8000th之後的字節將被忽略!花了我一段時間纔得到那個! – randomdude
-1誤導讀者(當然,無意中)使用UTF-8。 SQL Server(和Windows一般)使用UTF-16。因此,這似乎適用於目前僅使用代碼點0 - 127,或可能高達256的許多人。但使用UTF-8會導致如下問題:[基於.net的SQL CLR函數ComputeHash不是使用Cyrrilic](http://stackoverflow.com/a/35273859/577765) –
@randomdude您的經驗是由於SSDT的舊版本如何生成T-SQL包裝器對象。默認情況下,對'SqlString'使用'NVARCHAR(4000)',對'SqlChars'使用'NVARCHAR(MAX)'。但是從Visual Studio 2013開始,默認情況下就改爲使用'NVARCHAR(MAX)'。不過,正如你所提到的那樣,最好是明確地使用'[SqlFacet()]',但使用較新的SSDT版本的人不會遇到這種情況。此外,SQLCLR僅支持'NVARCHAR',因此它實際上會截斷爲4000個字符:-)。 –
- 1. 如何在SQL Server 2005的列中存儲超過8000個字符?
- 2. 如何創建大小超過8000字節的SQL varbinary?
- 3. 如何使用C#將超過8000個字節插入到SQL中?
- 4. 如何在SQL Server 2012行中內聯存儲超過8000個字節的數據?
- 5. 在nvarchar(max)字段中插入MSSQL超過8000個字符
- 6. 處理超過8000個字符的存儲過程參數
- 7. 圖像的最大尺寸不能超過8000字節?
- 8. 如果存儲過程的參數超過在SQL Server 8000個字符如何解決2008年
- 9. 使用SQL Server作爲源時的AWS DMS限制 - 複製具有超過8000字節信息的行
- 10. 如何在SQL Server參數中存儲超過4000個字符?
- 11. 在sql server 2000中替換ntext(超過4000個字符)
- 12. 如何寫在文本列超過8000個字符的觸發(SQL2K)
- 13. 在MD5列上散列查詢SQL Server
- 14. 如何添加超過1024列SQL Server
- 15. 水晶報表與SQL-服務器 - 使用VARCHAR超過8000個字符
- 16. 用C#將多個字節[]一起散列成單個散列?
- 17. SQL Server 2008 VarChar(Max)只返回8000個字符。爲什麼?
- 18. 如何將超過8000個字符的XML字段轉換爲字符串?
- 19. NTEXT與SQL Server CE的超過4000個字符中的Windows Phone
- 20. SQL Server:索引或主鍵的總大小不能超過900個字節
- 21. SQL Server 2008 R2中的散列表
- 22. 將SQL Server 2005數據庫的文件附件限制爲值> 8000字節
- 23. SQL Server精簡版 - 字節數組截斷長度爲8000例外
- 24. 如何在SQL Server varbinary(max)字段中搜索字節序列?
- 25. 在sql server中爲一組行創建一個散列
- 26. SQL Server:超時過期
- 27. 如何搜索在SQL Server 2012中的日期超過兩列
- 28. 散列字節數組
- 29. SQL Server 2000 varchar(8000)截斷爲256?
- 30. 在SQL Server 2005中超時
感謝Paul,這是一個非常好的內部使用解決方案。但在這種情況下,它必須完全符合sha1 – SDReyes
@SDReyes:添加到我的答案的另一個想法:依靠SQL Server的CLR集成並在.NET程序集中執行哈希。 –