ホームページ  >  記事  >  データベース  >  SQL でバイナリ文字列間のハミング距離を効率的に計算するにはどうすればよいですか?

SQL でバイナリ文字列間のハミング距離を効率的に計算するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 06:11:29851ブラウズ

How can I efficiently calculate Hamming distance between binary strings in SQL?

SQL でのバイナリ文字列のハミング ディスタンスの計算

問題ステートメント:

データベース テーブルは、多くの場合、SHA256 ハッシュをバイナリ値として保存します。ハミング距離は、2 つのハッシュ間のビットごとの違いの数を表し、類似性分析にとって重要な指標です。この記事の目的は、指定された値と指定された列の各ハッシュの間のハミング距離を計算する SQL ソリューションを提供することです。

既存の非効率なアプローチ:

バイナリ文字列をより小さな整数のチャンクに分割し、各チャンクのハミング距離を計算し、その結果を合計するのは、面倒でパフォーマンスが制限される方法です。

改善されたアプローチ:

単一の BINARY カラムではなく複数の BIGINT カラムにハッシュを保存すると、大幅に改善されます。パフォーマンス。これにより、複数の BIGINT 値間のハミング距離を効率的に計算できるカスタム関数を作成できます。

BIGINT のハミング距離関数:

次のカスタム関数を作成して、BIGINT 値間のハミング距離を計算できます。 4 つの BIGINT:

<code class="sql">CREATE FUNCTION HAMMINGDISTANCE(
  A0 BIGINT, A1 BIGINT, A2 BIGINT, A3 BIGINT, 
  B0 BIGINT, B1 BIGINT, B2 BIGINT, B3 BIGINT
)
RETURNS INT DETERMINISTIC
RETURN 
  BIT_COUNT(A0 ^ B0) +
  BIT_COUNT(A1 ^ B1) +
  BIT_COUNT(A2 ^ B2) +
  BIT_COUNT(A3 ^ B3);</code>

使用例:

この関数を使用すると、次のクエリを使用して、指定された値までのハミング距離によってテーブル エントリを並べ替えることができます:

<code class="sql">SELECT * FROM table 
  ORDER BY HAMMINGDISTANCE(col0, col1, col2, col3, UNHEX(<insert supplied sha256 hash here>)) ASC 
  LIMIT 10</code>

結論:

SHA256 ハッシュを 4 つの BIGINT 列に分割し、カスタム関数を使用することは、SQL でハミング距離を計算するための非常に効率的なアプローチです。この方法では、ハッシュを BINARY 値として保存し、従来の整数ベースの計算を使用するよりもパフォーマンスが大幅に向上します。

以上がSQL でバイナリ文字列間のハミング距離を効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。