J'ai plus de 100 millions de chaînes uniques (Varcharchar (100) uniques dans la base de données MySQL). Maintenant, j'utilise le code ci-dessous pour créer un hachage unique à partir d'eux (Varcharchar (32) unique) afin de réduire la taille de l'index de la table Innodb (un index unique sur Varcharate (100) est d'environ 3 fois plus grand que sur le champ Varcharchar (32). ).
id = hashlib.md5(str).hexdigest()
4 Réponses :
Un moyen brut peut être, vous pourriez faire du MD5, puis choisissez les 16 premiers caractères, au lieu de tous les 32. Les collisions ne seront toujours pas aussi élevées, et vous aurez une garantie d'unicité raisonnable. P>
Les solutions les plus simples consistent à convertir des données hexadécimales (yor digests ont une base de 16) à autre chose, par exemple. avec base 64. P>
Si vous êtes d'accord sur un niveau de risque plus élevé, vous ne pouvez utiliser que par exemple les dix premiers chiffres (hexadécimal) du digest. Il vous donnera 16 ** 10 code> (plus que
10 ** 12 code>) possibilités au lieu de
16 ** 32 code> (plus que
10 ** 38 code>), mais il est toujours énorme et est une technique couramment utilisée (GIT et GitHub utilise généralement 7 chiffres pour identifier les engagements, Afair). P>
D'ailleurs. MD5 codé à l'aide de Base64 prend 22 caractères et vous avez la même information qu'avec MD5 cru. Si vous passez de 32 à 22 chattactes vous satisfere, alors cela va bien.
Depuis que le hachage et la compression sont très similaires, une solution évidente consiste à utiliser un algorithme de compression pour comprimer vos clés. Cela préservera également le caractère unique des clés. P>
Vous pouvez l'enregistrer sous forme d'entier: ou sous forme de chaîne binaire: p>
SHA1? Notez que vous pouvez rendre les chaînes plus courtes à l'aide d'une version de base-64 du digest plutôt que d'un hexagonal:
base64.b64encode (hashlib.md5 ("FOO"). Digest ()) CODE>
Vous pouvez utiliser une colonne binaire (16) pour stocker le hachage MD5, sans encodage hexagonal ou base64.