2011-10-14 17 views

cevap

5

Girdi 8k (veya 4k veya 2k) yığınları olabilir ve daha sonra bu karmaları birleştirebilir veya yeni bir karma değeri haline getirebilirsiniz. SQL Server dışında oluşturulan karmaları karşılaştırmak için benzer bir algoritma (örneğin, harici bir .NET uygulamasında) oluşturmanız gerekiyorsa, bu durum zor olabilir.

Başka bir seçenek: SQL Server'ın CLR integration üzerine yalın ve bir .NET derlemesinde karma işlemi gerçekleştirin.

+1

Teşekkürler Paul, iç kullanım için gerçekten iyi bir çözüm. ama bu durumda sha1 – SDReyes

+1

@SDReyes ile tamamen uyumlu olması gerekiyor: Cevabıma başka bir fikir eklendi: SQL Server'ın CLR entegrasyonu üzerine yalın ve bir .NET derlemesinde karma işlemi gerçekleştirin. veri bütünlük uğruna tek bir karma değer (sağlamalarının karmasını.) saklanabilir bir XML yapısı ile öneririm olsa –

2

Paul'ün fikri gibi, yığınlama için akla gelen tek bir fikir, XML dizisindeki karma dizgeyi ayrı bir XML öğesi olarak her bir yığınla depolamak olacaktır.

+0

1 İyi fikir, sen N. yığın endeksine bir karma değer eşleyen bir nitelik gerekir hash edilen veriler. –

9

Bir SQL CLR fonksiyon yazabiliriz:

[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)); 
} 

Ve sonra böyle SQL çağrılabilir: uzunluk 8k üzerinde olacağını eğer

--these return the same value 
select HASHBYTES('md5', 'test stuff') 
select dbo.BigHashBytes('md5', 'test stuff') 

BigHashBytes gereklidir.

+7

Sessizce 8000 bayta kesilen CLR SP parametrelerine dikkat edin - parametreyi '[SqlFacet (MaxSize = -1)] ile etiketlemeliydim; aksi takdirde 8000'den sonra baytlar göz ardı edilmemelidir! Bunu almak için bir süre beni aldı! Yanıltıcı okuyucular için (istemeden de olsa) UTF-8'i kullanmak için – randomdude

+0

-1. SQL Server (ve genel olarak Windows) UTF-16 kullanır. Bu nedenle şu anda sadece Code Points 0 - 127 veya muhtemelen 256'ya kadar olan birçok kişi için çalışacaktır. Ancak UTF-8'in kullanılması bu soru gibi sorunlara yol açar: [. NET ComputeHash'a dayalı SQL CLR işlevi Cyrrilic ile çalışmak] (http://stackoverflow.com/a/35273859/577765) –

+0

@randomdude Deneyimleriniz, SSDT'nin eski sürümlerinin T-SQL sarmalayıcı nesnelerinin ne kadar üretildiğinden kaynaklanıyordu. Varsayılan, SqlString' için 'NVARCHAR (4000)' ve 'SqlChars'' için' NVARCHAR (MAX) 'kullanmak için kullanılır. Ancak, Visual Studio 2013'ün zamanından beri, varsayılan her ikisi için de 'NVARCHAR (MAX)' kullanacak şekilde değiştirildi. Yine de, açık ve her zamanki gibi kullanmanız [SqlFacet()] 'i kullanmak daha iyidir, ancak daha yeni SSDT sürümlerini kullanan kişiler bu işe yaramaz. Ayrıca, SQLCLR sadece NVARCHAR'ı desteklemektedir, bu yüzden 4000 karakterde kesilecektir :-). –

İlgili konular