10
votes

MySQL - détecter les modifications des données avec une fonction de hachage sur une partie de la table

J'ai besoin de générer un seul hachage sur certaines données dans une table xxx pré>

i.e. F1, F3, FN où F2 = 10 P>

SELECT md5(CONCAT_WS('#',F1,F3,FN)) FROM Tabe1 WHERE F2=10


4 commentaires

Pourquoi avez-vous besoin de ces hachages? Il y a probablement un meilleur moyen de réaliser ce dont vous avez besoin que de haquer sur toutes vos données.


@Ben - Le hash est utilisé pour détecter les modifications de données dans le tableau


Ils ne veulent pas utiliser de déclencheurs? dev.mysql.com/doc/refman/5.0/fr/triggers. HTML


Charles est correct, calculer une rampe sur de très larges tables peut considérablement accélérer le processus de détection de modifications. Je suis ici pour savoir comment accomplir cela dans MySQL. J'ai généralement fait cela dans SQL Server.


6 Réponses :


10
votes

1)

SELECT MD5( GROUP_CONCAT( CONCAT_WS('#',F1,F3,FN) SEPARATOR '##' ) ) FROM Table1


2 commentaires

Est-il possible de sélectionner toutes les colonnes au lieu de répertorier chaque colonne?


@Stefan - Utilisez Dynamic SQL et le schéma d'information.



3
votes

J'utiliserais un Trigger MySQL pour détecter les modifications sur insertion, supprimer, mettre à jour, etc.


0 commentaires

6
votes

Quant à la vitesse, vous devriez essayer. Cela dépend de la manière dont les fonctions sont implémentées.

Les chances sont cependant que vous verrez très peu de différences de vitesse. Les fonctions de hachage que vous citez sont toutes plus rapides que ce qu'est un disque moyen peut cracher, la question n'est donc pas vraiment "quelle fonction hachaîne rendra le code le plus rapide?" Mais "quelle fonction hachage rendra la CPU la plus inactive alors qu'elle attend les données du disque?".

Sur mon Intel Core2 Q6600, cadencé à 2,4 GHz (mode 64 bits), avec ma propre implémentation de fonctions de hachage, je reçois les vitesses de hachage suivantes:

  • MD5: 411 MB / S
  • SHA-1: 336 MB / S
  • SHA-256: 145 MB / S
  • SHA-512: 185 MB / S

    qui utilise un seul noyau uniquement. Mes disques durs à environ 100 Mo / s, donc on peut dire que même avec SHA-256, le processus de hachage n'utilisera pas plus de 17% de la puissance du processeur de la machine. Bien sûr, rien ne garantit que la mise en œuvre utilisée par MySQL est si rapide, c'est pourquoi vous devriez essayer. En outre, en mode 32 bits, la performance SHA-512 diminue un peu.

    Les faiblesses cryptographiquement, (graves) ont été trouvées dans MD5 et SHA-1, de sorte que si vous travaillez dans un paramètre pertinent sur la sécurité (c'est-à-dire que vous souhaitez détecter des modifications même s'il y a une personne qui peut choisir certains des changements et Cela préférerait que vous ne détectez pas lesdites changements), vous devez vous en tenir à SHA-256 ou SHA-512, qui, autant que nous sachions, sont suffisamment robustes. MD5 et SHA-1 sont toujours corrects dans des situations non-sécurité, cependant.


0 commentaires

3
votes

Allez ce fil est vieux, peut-être que c'est ce dont vous avez besoin: http://dev.mysql.com/doc/refman/5.0 /en/checksum-table.html


0 commentaires

1
votes

voir bit_xor: http://dev.mysql.com/doc/refman /5.6/fr/group-fonctions.html "Retourne le xor Bitwise de tous les bits dans EXPR. Le calcul est effectué avec une précision de 64 bits (Bigint). Cette fonction renvoie 0 s'il n'y avait pas de rangées correspondantes." Pour un exemple d'utilisation, vérifiez PT-Table-Sync.


0 commentaires

1
votes

Si, par une raison quelconque, vous ne pouvez pas utiliser de déclencheurs , une approche différente consiste à utiliser l'option Concat, comme: xxx

mais sache que si le La table a une allocation de données que la requête sera lente! Si possible, essayez d'exclure les colonnes inutiles du Concact.

Notez également que par défaut MySQL Max Concact est 1024 , il est peut-être nécessaire de la modifier en exécutant d'abord la requête suivante : xxx

Notez que 18446744073709547520 est la valeur maximale, vous pouvez utiliser un autre!


2 commentaires

Pourriez-vous ne pas exécuter: Sélectionnez MD5 (Group_Concat (MD5 (Concat_ws (Concat_ws ('', F1, F3, FN) Séparateur ',')))))) Du tableau1 pour ceux qui sont avec de grandes lignes de table (plus de 32 Personnages) Pour réduire davantage la probabilité de frapper la limite GROUP_CONCACT_MAX_LEN? Devrait permettre environ 558 9992 240 000 000 rangées (18446744073709547520/33).


Notez que CONCAT_WS saute des colonnes NULL, donc si votre table a des colonnes NULLL, cela générerait la même rangée HASH pour des lignes: null, 2, null , 2, null, null et null, null, 2 qui pourrait conduire à d'autres problèmes. Pour résoudre ce problème, vous devez envelopper chaque colonne avec coalesce ( [nom de colonne] , 'null')