8

1億を超える一意の文字列があります(MySQLデータベースのVARCHAR(100)UNIQUE)。次に、以下のコードを使用して、InnoDBテーブルのインデックスサイズを減らすために、それらから一意のハッシュ(VARCHAR(32)UNIQUE)を作成します(varchar(100)の一意のインデックスはvarchar(32)フィールドの約3倍です) )。

id = hashlib.md5(str).hexdigest()

それらの文字列からより短いIDを作成し、妥当な一意性を保証する他の方法はありますか?

4

4 に答える 4

10

あなたはそれを整数として保存することができます:

id_ = int(hashlib.md5(your_str).hexdigest(), 16)

またはバイナリ文字列として:

id_ = hashlib.md5(your_str).digest()
于 2012-06-19T07:03:25.257 に答える
2

大雑把な方法の1つは、md5を実行してから、32文字すべてではなく、最初の16文字を選択することです。衝突はそれほど高くなく、妥当な一意性が保証されます。

于 2012-06-19T06:23:52.553 に答える
2

最も簡単な解決策は、16進データ(またはダイジェストの基数が16)を別のデータに変換することです。Base64を使用します。

ある程度のリスクが高いことに同意する場合は、ダイジェストの最初の10桁(16進数)のみを使用できます。16**10(以上10**12)の代わりに16**32(以上)の可能性を提供します10**38が、それでも巨大であり、一般的に使用される手法です(GitとGithubは通常、コミットを識別するために7桁を使用します)。

于 2012-06-19T06:32:15.680 に答える
0

ハッシュと圧縮は非常に似ているため、明らかな解決策は、圧縮アルゴリズムを使用してキーを圧縮することです。これにより、キーの一意性も保持されます。

于 2012-06-19T06:33:13.807 に答える