Comment puis-je calculer l'équivalent de SQL Server (hashbytes('SHA1',[Nomrubrique])) en C#?
Dans ma base de données j'ai une colonne calculée qui contient un hash SHA1 de la colonne appelée URLString qui est titulaire d'Url (par exemple, "http://xxxx.com/index.html").
J'ai souvent besoin d'interroger la table pour trouver une URL spécifique basé sur le URLString colonne.
La table contient des 100K et ces requêtes prendre plusieurs secondes (à l'aide de SQL Azure).
Depuis l'Url peut être assez long, je ne peux pas créer un index sur cette colonne (au-dessus de 450 octets).
Pour accélérer les choses, je veux calculer l'équivalent de SQL Server hashbytes('SHA1',[URLString]) à partir de C# et de la requête sur la base de cette valeur.
J'ai essayé le code ci-dessous, mais la valeur que je reçois est différent de celui calculé par la base de données.
var urlString = Encoding.ASCII.GetBytes(url.URLString); //UTF8 also fails
var sha1 = new SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(urlString);
Ai-je raté quelque chose de trivial ici?
Je suis ouvert à d'autres idées qui peuvent résoudre le même problème (tant qu'ils sont pris en charge par SQL Azure).
Exemple: dans la base de données automatiquement calculé la valeur SHA1 de l'URL http://www.whatismyip.org/ est 0xAE66CA69A157186A511ED462153D7Ca65f0c1bf7.
Si le résultat ne correspond pas du côté serveur, le calcul essayez d'utiliser l'un des nombreux en ligne de hachage des calculatrices à vérifier le résultat est correct. Si l'on est incorrect, il peut être causée par le sel utilisé
C'est une auto-colonne calculée, lorsque j'insère une nouvelle URL de la valeur est calculée et inséré par la base de données.
Si il est une valeur salt, est-il la même valeur pour tous les Serveurs SQL? Peut-il être obtenu à partir de quelque part?
Il doit y avoir un morceau de script SQL quelque part qui calcule. Sauf si vous trouvez qu'il n'y a aucun moyen de deviner ce qu'il se passe
OriginalL'auteur Gilad Gat | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
Vous êtes susceptible de vous faire piquer par l'encodage des caractères différences:
http://weblogs.sqlteam.com/mladenp/archive/2009/04/28/Comparing-SQL-Server-HASHBYTES-function-and-.Net-hashing.aspx
Vous pourriez essayer d'obtenir les octets via
Encoding.ASCII.GetBytes(url)
ouEncoding.Unicode.GetBytes(url)
et voir lequel votre db.Pas de problème - ouais, les algorithmes de hachage sont TRÈS sensibles à l'encodage.
En général, vous pouvez utiliser
Select TABLE_NAME, COLUMN_NAME, Columns.COLLATION_NAME From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Yourtable'
pour vérifier le mode de classement utilisé pour une table/colonne. De la collation, si elle est_CP1_
(commeSQL_Latin1_General_Cp1_CS_AS
), alors il estWindows-1252
, si elle est_CP###_
puis l' ### est le nombre de page de codes (commeSQL_Latin1_General_Cp437_CS_AS
c'est-à 437), sinon, vous avez à la recherche 🙂varchar = UTF8 / (extra accents etc) nvarchar = UNICODE
OriginalL'auteur JerKimball
Ci-dessous sont deux méthodes qui n'malaxage de la chaîne et d'octets. Le HashBytes méthode retourne en Base64 de la suite d'octets, mais vous pouvez revenir juste les octets si vous les préférez
encryption != hashing
cela a été extrait à partir de la production de code, et il le "clearbytes' a de sens. Il n'est également pas une contradiction, car la sortie n'est pas nommé "encryptedText" ou "encryptedBytes" et l'entrée est la même "texte clair" et de décrire le contenu de manière appropriée
C'est essentiellement la même solution que j'ai posté, sauf avec SHA1.Créer() à la place de mon nouveau SHA1CryptoServiceProvider(). Je l'ai essayé et j'ai obtenu le même résultat que j'ai fait avant (différents que la base de données)
OriginalL'auteur Sten Petrov
Le code ci-dessous est l'équivalent de SQL Server hashbytes('sha1')
OriginalL'auteur Mike Minh Le