(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022094108
(43)【公開日】2022-06-24
(54)【発明の名称】圧縮装置および制御方法
(51)【国際特許分類】
H03M 7/40 20060101AFI20220617BHJP
G06F 16/174 20190101ALI20220617BHJP
【FI】
H03M7/40
G06F16/174
【審査請求】未請求
【請求項の数】11
【出願形態】OL
(21)【出願番号】P 2020206930
(22)【出願日】2020-12-14
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】特許業務法人スズエ国際特許事務所
(72)【発明者】
【氏名】深澤 洋平
(72)【発明者】
【氏名】及川 恒平
(72)【発明者】
【氏名】小玉 翔
(72)【発明者】
【氏名】中西 圭里
(72)【発明者】
【氏名】三浦 貴
(72)【発明者】
【氏名】八島 大亮
(72)【発明者】
【氏名】住吉 正人
(72)【発明者】
【氏名】王 哲也
【テーマコード(参考)】
5J064
【Fターム(参考)】
5J064BA09
5J064BC01
5J064BC02
5J064BC14
5J064BD03
(57)【要約】
【課題】 辞書内のデータの検索精度を向上できる圧縮装置を実現する。
【解決手段】 実施形態によれば、圧縮装置は、第1記憶部、第2記憶部、計算部、および比較部を具備する。第1記憶部は複数のハッシュ値にそれぞれ関連付けられた複数のアドレスを記憶する。第2記憶部は前記複数のアドレスでそれぞれ特定される複数の記憶領域であって、複数のデータをそれぞれ記憶する複数の記憶領域を含む。計算部は第1データの少なくとも一部に基づいて、前記第1データに対して用いるべき第1ハッシュ関数を決定し、前記第1ハッシュ関数と、前記第1データに含まれる第2データの少なくとも一部とを用いて、第1ハッシュ値を計算する。比較部は前記第1記憶部に記憶された、前記第1ハッシュ値に関連付けられた第1アドレスを用いて、前記第2記憶部内の前記第1アドレスで特定される記憶領域から第3データを取得し、前記第2データと前記第3データとを比較する。
【選択図】
図12
【特許請求の範囲】
【請求項1】
複数のハッシュ値にそれぞれ関連付けられた複数のアドレスを記憶する第1記憶部と、
前記複数のアドレスでそれぞれ特定される複数の記憶領域であって、複数のデータをそれぞれ記憶する複数の記憶領域を含む第2記憶部と、
第1データの少なくとも一部に基づいて、前記第1データに対して用いるべき第1ハッシュ関数を決定し、前記第1ハッシュ関数と、前記第1データに含まれる第2データの少なくとも一部とを用いて、第1ハッシュ値を計算する計算部と、
前記第1記憶部に記憶された、前記第1ハッシュ値に関連付けられた第1アドレスを用いて、前記第2記憶部内の前記第1アドレスで特定される記憶領域から第3データを取得し、前記第2データと前記第3データとを比較する比較部と
を具備する圧縮装置。
【請求項2】
前記第1データは、1つ以上のデータ部で構成されるnバイトのデータを含み、
前記1つ以上のデータ部の各々は、mビットの長さを有し、
前記nは1以上の整数であり、
前記mは2以上の整数であり、
前記計算部は、
前記1つ以上のデータ部にそれぞれ含まれる1つ以上の第iビットの内、0であるビットの第1割合、または前記1つ以上の第iビットの内、1であるビットの第2割合を計算し、
前記第1割合または前記第2割合が第1閾値を超えている場合、前記第iビットを用いない前記第1ハッシュ関数を決定し、
前記iは、0以上であって前記m未満の整数である、
請求項1記載の圧縮装置。
【請求項3】
前記第1データは、1つ以上のデータ部で構成されるnバイトのデータを含み、
前記1つ以上のデータ部の各々は、mビットの長さを有し、
前記nは1以上の整数であり、
前記mは2以上の整数であり、
前記計算部は、
前記1つ以上のデータ部にそれぞれ含まれる1つ以上の第iビットの内、0であるビットの第1割合、または前記1つ以上の第iビットの内、1であるビットの第2割合を計算し、
前記第1割合または前記第2割合が第2閾値未満である場合、前記第iビットを用いる回数が、前記第iビット以外の1以上のビットをそれぞれ用いる回数よりも少ない前記第1ハッシュ関数を決定し、
前記iは、0以上であって前記m未満の整数である、請求項1記載の圧縮装置。
【請求項4】
前記第1データは、1つ以上のデータ部で構成されるnバイトのデータを含み、
前記1つ以上のデータ部の各々は、mビットの長さを有し、
前記nは1以上の整数であり、
前記mは2以上の整数であり、
前記計算部は、前記1つ以上のデータ部において、出現する値に偏りがある第iビットに関連する情報を取得し、前記情報を用いて前記第1ハッシュ関数を決定し、
前記iは、0以上であって前記m未満の整数である、
請求項1記載の圧縮装置。
【請求項5】
前記情報は、前記1つ以上のデータ部にそれぞれ含まれる1つ以上の第iビットの内、0であるビットの第1割合、または前記1つ以上の第iビットの内、1であるビットの第2割合に関連する情報である、
請求項4記載の圧縮装置。
【請求項6】
前記計算部は、前記情報を用いて、前記第iビットを用いない前記第1ハッシュ関数を決定する、
請求項4または請求項5記載の圧縮装置。
【請求項7】
前記計算部は、前記情報を用いて、前記第iビットを用いる回数が、前記第iビット以外の1以上のビットをそれぞれ用いる回数よりも少ない前記第1ハッシュ関数を決定する、
請求項4または請求項5記載の圧縮装置。
【請求項8】
前記計算部は、
前記第1データの少なくとも一部に基づいて、前記第1データに対して用いるべき前記第1ハッシュ関数を決定し、
前記第1ハッシュ関数と、前記第1データに含まれる前記第3データの少なくとも一部とを用いて、前記第1ハッシュ値を計算し、
前記第2記憶部は、前記第1アドレスで特定される前記記憶領域に前記第3データを記憶し、
前記第1記憶部は、前記第1ハッシュ値に関連付けられた前記第1アドレスを記憶し、
前記計算部は、前記第1ハッシュ関数と、前記第2データの少なくとも一部とを用いて、前記第1ハッシュ値を計算し、
前記比較部は、前記第1記憶部に記憶された、前記第1ハッシュ値に関連付けられた前記第1アドレスを用いて、前記第2記憶部内の前記第1アドレスで特定される記憶領域から前記第3データを取得し、前記第2データと前記第3データとを比較する、
請求項1乃至請求項7のいずれか一項に記載の圧縮装置。
【請求項9】
入力された第4データを前記第1データに変換する変換部をさらに具備する、
請求項1乃至請求項8のいずれか一項に記載の圧縮装置。
【請求項10】
前記変換部は、前記第1データを前記第4データに変換するための変換情報を生成する、
請求項9記載の圧縮装置。
【請求項11】
圧縮装置を制御する制御方法であって、
前記圧縮装置は、
複数のハッシュ値にそれぞれ関連付けられた複数のアドレスを記憶する第1記憶部と、
前記複数のアドレスでそれぞれ特定される複数の記憶領域であって、複数のデータをそれぞれ記憶する複数の記憶領域を含む第2記憶部とを具備し、
前記制御方法は、
第1データの少なくとも一部に基づいて、前記第1データに対して用いるべき第1ハッシュ関数を決定し、
前記第1ハッシュ関数と、前記第1データに含まれる第2データの少なくとも一部とを用いて、第1ハッシュ値を計算し、
前記第1記憶部内の、前記第1ハッシュ値に関連付けられた第1アドレスを用いて、前記第2記憶部内の前記第1アドレスで特定される記憶領域から第3データを取得し、前記第2データと前記第3データとを比較する、制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、圧縮装置および制御方法に関する。
【背景技術】
【0002】
ハードディスクドライブ(HDD)やソリッドステートドライブ(SSD)のようなストレージに対して、大量の文書データをそのまま格納することは、ストレージの容量を圧迫する。これは、例えばデータセンターにおいて、データを格納するためのコストを増大させる。
【0003】
一般に、データを可逆圧縮して、可逆圧縮したデータをストレージに格納する方法で、ストレージに格納されるデータ量が削減される。データを可逆圧縮する方法の1つに、辞書式符号化とエントロピー符号化を組み合わせた方法がある。代表的なgzipの辞書式符号化では、過去に入力されたデータ(例えば文字列)を保持する辞書バッファを利用する。gzipの辞書式符号化では、辞書バッファを検索して圧縮対象のデータと少なくとも一部が一致する過去のデータを取得し、辞書バッファのアドレスと一致長とを得る。辞書バッファのアドレスは、辞書バッファにおいて、取得した過去のデータが記憶されているアドレスである。一致長は、取得した過去のデータと圧縮対象のデータとで一致した部分の長さである。圧縮対象のデータをアドレスと一致長とに変換することにより、データを圧縮できる。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
辞書バッファを検索して圧縮対象のデータと少なくとも一部が一致する過去のデータを取得する方法には、ハッシュ関数が利用されることがある。ハッシュ関数を用いる際に起きるハッシュの衝突は、辞書バッファからデータを検索する精度を低下させる可能性がある。
【0006】
本発明が解決しようとする課題は、辞書内のデータの検索精度を向上できる圧縮装置および制御方法を提供することにある。
【課題を解決するための手段】
【0007】
実施形態によれば、圧縮装置は、第1記憶部、第2記憶部、計算部、および比較部を具備する。第1記憶部は、複数のハッシュ値にそれぞれ関連付けられた複数のアドレスを記憶する。第2記憶部は、前記複数のアドレスでそれぞれ特定される複数の記憶領域であって、複数のデータをそれぞれ記憶する複数の記憶領域を含む。計算部は、第1データの少なくとも一部に基づいて、前記第1データに対して用いるべき第1ハッシュ関数を決定し、前記第1ハッシュ関数と、前記第1データに含まれる第2データの少なくとも一部とを用いて、第1ハッシュ値を計算する。比較部は、前記第1記憶部に記憶された、前記第1ハッシュ値に関連付けられた第1アドレスを用いて、前記第2記憶部内の前記第1アドレスで特定される記憶領域から第3データを取得し、前記第2データと前記第3データとを比較する。
【図面の簡単な説明】
【0008】
【
図1】第1実施形態に係る圧縮装置を含むメモリシステムの一構成例を示すブロック図。
【
図2】第1実施形態の圧縮装置の一構成例を示すブロック図。
【
図3】比較例に係る圧縮装置に設けられる検索部の一構成例を示すブロック図。
【
図4】ハッシュテーブルおよび辞書バッファを用いて入力データを登録する例を示す図。
【
図5】
図4のハッシュテーブルを用いて、新たな入力データを辞書バッファ内のデータと比較する例を示す図。
【
図6】
図4のハッシュテーブルおよび辞書バッファを用いて、新たな入力データを辞書バッファに登録する例を示す図。
【
図7】ハッシュテーブルおよび辞書バッファを用いて入力データを登録する別の例を示す図。
【
図8】ハッシュの衝突により、
図7の入力データの記憶位置を示す辞書アドレスが、ハッシュテーブルから追い出される例を示す図。
【
図9】
図8のハッシュの衝突により、辞書バッファ内のデータ検索の精度が低下する例を示す図。
【
図10】ハッシュの衝突を発生させるハッシュ関数の例を示す図。
【
図11】第1実施形態の圧縮装置において用いられる、ハッシュの衝突が発生する確率を低下させるハッシュ関数の例を示す図。
【
図12】第1実施形態の圧縮装置に設けられる検索部の一構成例を示すブロック図。
【
図13】
図12の検索部に設けられるデータ判断部およびハッシュ計算部の動作例を示す図。
【
図14】第1実施形態の圧縮装置において実行される検索処理の手順の例を示すフローチャート。
【
図15】第1実施形態の圧縮装置において実行されるハッシュ関数情報生成処理の手順の例を示すフローチャート。
【
図16】第2実施形態に係る圧縮装置に設けられる検索部の一構成例を示すブロック図。
【
図17】
図16の検索部に設けられるデータ判断部およびハッシュ計算部の動作例を示す図。
【
図18】第2実施形態の圧縮装置において実行されるハッシュ関数情報生成処理の手順の例を示すフローチャート。
【
図19】第3実施形態に係る圧縮装置に設けられる検索部の一構成例を示すブロック図。
【
図20】第3実施形態の圧縮装置において生成されるデータ変換表の一構成例を示す図。
【
図21】
図19の検索部に設けられるデータ変換部によるデータ変換によって、特定のビットを用いないハッシュ関数が決定される例を示す図。
【
図22】第3実施形態の圧縮装置において実行される検索処理の手順の例を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、実施の形態について図面を参照して説明する。
【0010】
(第1実施形態)
図1は、第1実施形態に係るメモリシステム3を含む情報処理システム1の構成例を示す。情報処理システム1は、ホストデバイス2(以下、ホスト2と称する)と、メモリシステム3とを含む。
【0011】
メモリシステム3は、NAND型フラッシュメモリ5のような不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。メモリシステム3は、例えばNAND型フラッシュメモリ5を備えるソリッドステートドライブ(SSD)として実現される。以下では、メモリシステム3がSSDとして実現される場合について例示するが、メモリシステム3はハードディスクドライブ(HDD)として実現されてもよい。
【0012】
ホスト2は、大量且つ多様なデータをメモリシステム3に保存するストレージサーバであってもよいし、パーソナルコンピュータであってもよい。
【0013】
メモリシステム3は、ホスト2のストレージとして使用され得る。メモリシステム3はホスト2に内蔵されてもよいし、ホスト2にケーブルまたはネットワークを介して接続されてもよい。
【0014】
ホスト2とメモリシステム3とを接続するためのインタフェースは、SCSI、Serial Attached SCSI(SAS)、ATA(AT Attachment)、Serial ATA(SATA)、PCI Express(PCIe)(登録商標)、Ethernet(登録商標)、Fibre channel、NVM Express(NVMe)(登録商標)等に準拠する。
【0015】
メモリシステム3は、コントローラ4およびNAND型フラッシュメモリ5を備える。コントローラ4は、System-on-a-chip(SoC)のような回路によって実現され得る。
【0016】
コントローラ4は、揮発性メモリであるランダムアクセスメモリ(RAM)、例えばダイナミックランダムアクセスメモリ(DRAM)6を備えていてもよい。あるいは、スタティックランダムアクセスメモリ(SRAM)のようなRAMがコントローラ4に内蔵されていてもよい。なお、DRAM6が、コントローラ4に内蔵されていてもよい。
【0017】
DRAM6等のRAMには、例えばNAND型フラッシュメモリ5からロードされるファームウェア(FW)の格納領域が設けられる。
【0018】
NAND型フラッシュメモリ5は複数のブロックを含む。各ブロックは複数のページを含む。1つのブロックは最小の消去単位として機能する。ブロックは、「消去ブロック」、または「物理ブロック」と称されることもある。各ページは、同一ワード線に接続された複数のメモリセルを含む。1つのページは、データ書き込み動作およびデータ読み出し動作の単位である。なお、ワード線をデータ書き込み動作およびデータ読み出し動作の単位としてもよい。
【0019】
各ブロックに対して許容できるプログラム/イレーズサイクル数には上限(最大P/Eサイクル数)がある。あるブロックの1回のP/Eサイクルは、このブロック内のすべてのメモリセルを消去状態にするための消去動作と、このブロックのページそれぞれにデータを書き込む書き込み動作とを含む。
【0020】
コントローラ4は、ホストインタフェース(ホストI/F)11、CPU12、NANDインタフェース(NAND I/F)13、DRAMインタフェース(DRAM I/F)14、および圧縮装置15を含んでもよい。これらホストI/F11、CPU12、NAND I/F13、DRAM I/F14、および圧縮装置15は、バス10を介して相互接続され得る。
【0021】
コントローラ4は、Toggle DDR、Open NAND Flash Interface(ONFI)等のインタフェース規格に対応するNAND I/F13を介して、NAND型フラッシュメモリ5に電気的に接続されている。NAND I/F13は、NAND型フラッシュメモリ5を制御するように構成されたNAND制御回路として機能する。
【0022】
コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして機能する。
【0023】
コントローラ4は、NAND型フラッシュメモリ5のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能してもよい。このFTLによって実行されるデータ管理には、(1)論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、(2)ページ単位のリード/ライト動作とブロック単位の消去(イレーズ)動作とを隠蔽するための処理、等が含まれる。論理アドレスは、メモリシステム3をアドレス指定するためにホスト2によって使用されるアドレスである。
【0024】
論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングの管理は、論理物理アドレス変換テーブルを用いて実行される。コントローラ4は、論理物理アドレス変換テーブルを使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを特定の管理サイズ単位で管理する。ある論理アドレスに対応する物理アドレスは、この論理アドレスのデータが書き込まれたNAND型フラッシュメモリ5内の物理記憶位置を示す。論理物理アドレス変換テーブルは、メモリシステム3の電源オン時にNAND型フラッシュメモリ5からDRAM6にロードされてもよい。
【0025】
1つのページへのデータ書き込みは、1回のP/Eサイクル当たり1回のみ可能である。このため、コントローラ4は、ある論理アドレスに対応する更新データを、この論理アドレスに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ4は、この論理アドレスをこの別の物理記憶位置に関連付けるように論理物理アドレス変換テーブルを更新することにより、以前のデータを無効化する。
【0026】
ブロック管理には、不良ブロックの管理、ウェアレベリング、ガベージコレクション、等が含まれる。
【0027】
ホストI/F11は、メモリシステム3と、メモリシステム3の外部装置であるホスト2との通信を行うハードウェアインタフェースである。ホストI/F11は、ホスト2から様々なコマンド、例えば、I/Oコマンド、各種制御コマンドを受信する回路として機能する。I/Oコマンドには、ライトコマンド、リードコマンド、が含まれ得る。制御コマンドには、アンマップコマンド(トリムコマンド)、フォーマットコマンドが含まれ得る。ホストI/F11は、コマンドに応じた応答やデータをホスト2に送信する回路としても機能する。
【0028】
DRAM I/F14は、DRAM6のアクセスを制御するように構成されたDRAM制御回路として機能する。DRAM6の記憶領域は、FWを格納するための領域や、リード/ライトバッファ等として利用されるバッファ領域に割り当てられる。
【0029】
CPU12は、ホストI/F11、NAND I/F13、およびDRAM I/F14を制御するように構成されたプロセッサである。CPU12は、DRAM6にロードされたFWを実行することによって様々な処理を行う。つまり、FWはCPU12の動作を制御するための制御プログラムである。CPU12は、前述のFTLの処理に加え、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。なお、FTL処理およびコマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行されてもよい。
【0030】
圧縮装置15は、NAND型フラッシュメモリ5に書き込むべきデータを符号化することにより、そのデータを圧縮する。圧縮装置15は、例えばホスト2からライトコマンドを受け付けたことに応じて受信した平文のデータを、符号化する。圧縮装置15は、データを圧縮するために、例えば、辞書式符号化とエントロピー符号化とを組み合わせた方法を実現するための構成を有する。
【0031】
図2は圧縮装置15の一構成例を示す。圧縮装置15は、例えば、検索部151、エントロピー符号化部152、およびパック処理部153を備える。
【0032】
検索部151は入力データに対する辞書式符号化を行う。入力データは、圧縮対象のデータである。辞書式符号化では、過去に入力されたデータを記憶するバッファ(以下、辞書バッファと称する)が利用される。辞書式符号化では、辞書バッファを検索して入力データと少なくとも一部が一致する過去のデータを取得し、辞書バッファのアドレスとデータの一致長との組を得る。辞書バッファのアドレスは、辞書バッファにおいて、取得した過去のデータが記憶されているアドレスである。データの一致長は、取得した過去のデータと入力データとで一致した部分の長さである。検索部151は、入力データを、辞書バッファのアドレスとデータの一致長との組に変換することで、入力データを圧縮できる。
【0033】
検索部151は、入力データと少なくとも一部が一致する過去のデータが辞書バッファにある場合、辞書バッファのアドレスとデータの一致長との組を、エントロピー符号化部152に出力する。検索部151は、入力データと少なくとも一部が一致する過去のデータが辞書バッファにない場合、入力データをエントロピー符号化部152に出力する。
【0034】
エントロピー符号化部152は、検索部151から出力された辞書バッファのアドレスとデータの一致長との組に対して、エントロピー符号化を行う。また、エントロピー符号化部152は、検索部151から出力された入力データに対して、エントロピー符号化を行う。エントロピー符号化は、静的エントロピー符号化であってもよいし、動的(適応型)エントロピー符号化であってもよい。
【0035】
静的エントロピー符号化では、符号化すべき全てのシンボルを入力して蓄積(バッファリング)し、シンボル毎の出現頻度を示す頻度テーブルを取得する。そして、出現頻度が高いシンボルほど、短い符号長の符号が割り当てられるように、符号化テーブルを生成する。この符号化テーブルを用いて、蓄積したシンボルを符号語に変換することにより、高効率の符号化を実現できる。
【0036】
適応型エントロピー符号化では、符号化すべきシンボルを入力しながら頻度テーブルと符号化テーブルとを動的に更新する。適応型エントロピー符号化では、静的エントロピー符号化よりもレイテンシが短くなる。
【0037】
エントロピー符号化部152は、エントロピー符号化により得られたデータ(以下、符号化データと称する)をパック処理部153に出力する。
【0038】
パック処理部153は、エントロピー符号化部152から出力された1つ以上の符号化データをまとめて、特定のデータサイズ毎の圧縮データ(圧縮ストリーム)として出力し得る。
【0039】
検索部151、エントロピー符号化部152、およびパック処理部153の一部または全ては、回路のようなハードウェアとして実現されてもよいし、少なくとも1つのプロセッサによって実行されるプログラム(すなわちソフトウェア)として実現されてもよい。
【0040】
なお、コントローラ4は、伸張装置16を備えていてもよい。伸張装置16は、NAND型フラッシュメモリ5から読み出された圧縮データを復号することにより、その圧縮データを伸張する。例えば、コントローラ4がホスト2からリードコマンドを受け付けたことに応じて、伸張装置16は、NAND型フラッシュメモリ5から読み出された圧縮データを、復号する。CPU12は、ホスト2からのリードコマンドに対する応答として、復号されたデータをホスト2へ送信する。伸張装置16は、圧縮装置15による圧縮のための構成に準じて、圧縮データを伸張(すなわち逆変換)するための構成を備える。
【0041】
コントローラ4は、さらに、ECCエンコーダとECCデコーダを備えてもよい。この場合、ECCエンコーダが、パック処理部153から出力される圧縮データに対して誤り訂正用のパリティ(ECCパリティ)を生成し、生成したECCパリティと圧縮データとを有する符号語を生成する。そして、CPU12が、符号語をNAND I/F13経由でNAND型フラッシュメモリ5へ書き込むように構成される。また、この場合、コントローラ4が例えばホスト2から発行されるリードコマンドに基づいてNAND型フラッシュメモリ5からデータを読み出す際に、CPU12がNAND I/F13経由でNAND型フラッシュメモリ5から符号語を読み出し、ECCデコーダが当該読み出された符号語に対して、エラー検出処理、エラー訂正処理を実行し、圧縮データを生成する。そして、伸張装置16が、生成された圧縮データを伸張するように構成される。すなわち、コントローラ4は、パック処理部153から出力される圧縮データに基づくデータをNAND型フラッシュメモリ5に書き込み、NAND型フラッシュメモリ5から読み出したデータに基づいて圧縮データを生成し、生成された圧縮データを伸張するように構成されてもよい。
【0042】
ここで、検索部151が辞書バッファを検索して、入力データと少なくとも一部が一致する過去のデータを取得する方法について、具体的に説明する。以下では、説明を分かりやすくするために、入力データが文字列である場合を主に例示する。文字列である入力データを、入力文字列とも称する。なお、入力データは、文字列に限定されない種々のデータであり得る。
【0043】
辞書バッファを検索して入力文字列と少なくとも一部が一致する過去の文字列を取得する方法として最も単純な方法は、全探索である。全探索では、入力文字列を、辞書バッファに記憶されている全ての文字列それぞれと比較して、最も長く一致する文字列を辞書バッファから取得する。
【0044】
しかし、全探索では、入力文字列を、辞書バッファに記憶されている全ての文字列それぞれと比較するので、比較のための演算コストが大きい。そのため、辞書バッファを検索して入力文字列と少なくとも一部が一致する過去の文字列を取得する方法として、全探索は、演算コストを度外視して探索精度を高めるような場合を除いて、一般的には採用されない。
【0045】
辞書バッファを検索して入力文字列と少なくとも一部が一致する過去の文字列を取得する別の方法として、ハッシュによる検索がある。ハッシュによる検索では、ハッシュ関数が利用される。ハッシュ関数は、ある値を別の値に変換する関数である。辞書式符号化で用いられるハッシュ関数は、例えば、N文字(Nバイト)の文字列をMバイトの値に変換する関数である。つまり、変換後のMバイトの値は、N文字の文字列のハッシュ値である。なお、MはNよりも小さい。したがって、ハッシュ関数を用いた変換により、2N種類ある文字列が、より少ない2M種類の値に変換される。そのため、ハッシュ関数を用いた変換では、2つの異なる文字列が同一のハッシュ値に変換されることがある。2つの異なる文字列が同一のハッシュ値に変換されることは、ハッシュの衝突と称される。
【0046】
比較例に係る圧縮装置を用いて、ハッシュの衝突について説明する。
【0047】
図3は、比較例に係る圧縮装置に設けられる検索部の一構成例を示す。比較例に係る圧縮装置の検索部151Aは、ハッシュによる検索を実現する構成の一例である。検索部151Aは、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、および一致比較器24を備える。検索部151Aに対する入力データは、例えば、辞書バッファ21、ハッシュ計算部22、および一致比較器24に入力される。
【0048】
辞書バッファ21は複数の記憶領域を含む。複数の記憶領域の各々は、過去の入力データ(例えば文字列)を記憶する。複数の記憶領域の各々に記憶されているデータを、辞書データとも称する。複数の記憶領域は、複数のアドレスでそれぞれ特定される。つまり、複数のアドレスの各々は、辞書バッファ21内の記憶位置を示す。なお、複数のアドレスの各々を、辞書アドレスとも称する。
【0049】
ハッシュ計算部22はハッシュ関数を用いて、現在の入力データの少なくとも一部のハッシュ値を計算する。ハッシュ計算部22は、ハッシュ値の計算に、予め定められた1つのハッシュ関数を用いる。ハッシュ計算部22は、計算したハッシュ値をハッシュテーブル23に出力する。なお、以下では、入力データの少なくとも一部のハッシュ値を、単に、入力データのハッシュ値と称することがある。
【0050】
ハッシュテーブル23は、複数のハッシュ値にそれぞれ関連付けられた複数のデータを記憶し得る。より具体的には、ハッシュテーブル23は複数の記憶領域を備える。複数のハッシュ値の各々は、ハッシュテーブル23において、複数の記憶領域のいずれか1つを特定するアドレスとして機能する。あるハッシュ値を用いて特定した記憶領域は、そのハッシュ値に関連付けられたデータを記憶し得る。ハッシュ値に関連付けられたデータは、例えば、過去の入力データが記憶されている辞書バッファ21内の記憶領域を示すアドレス(すなわち辞書アドレス)である。
【0051】
ハッシュテーブル23は、ハッシュ計算部22によって出力された現在の入力データのハッシュ値をアドレスとして、ハッシュテーブル23内の複数の記憶領域の1つを特定する。
【0052】
特定した記憶領域に辞書アドレスが記憶されている場合、ハッシュテーブル23は、その辞書アドレスを辞書バッファ21に出力する。ハッシュテーブル23が辞書バッファ21に対して出力する辞書アドレスを、辞書リードアドレスとも称する。
【0053】
辞書バッファ21は、ハッシュテーブル23によって出力された辞書リードアドレスを用いて、辞書バッファ21内の複数の記憶領域の1つを特定する。そして、辞書バッファ21は、特定した記憶領域に記憶されている辞書データを一致比較器24に出力する。辞書データは、ハッシュテーブル23に記憶された、入力データのハッシュ値に関連付けられた辞書リードアドレスを用いて、辞書バッファ21内の辞書リードアドレスで特定される記憶領域から取得されたデータである。
【0054】
一致比較器24は、入力データと、辞書バッファ21によって出力された辞書データとを取得する。そして、一致比較器24は入力データと辞書データとを比較して、検索結果(比較結果)をエントロピー符号化部152に出力する。検索結果は、辞書データが取得された辞書アドレスと、一致長との組を含む。一致長は、入力データと辞書データの先頭から連続して一致した部分の長さを示す。なお、一致比較器24は、入力データと辞書データとで一致する部分がない場合、入力データをそのままエントロピー符号化部152に出力する。
【0055】
また、辞書バッファ21によって辞書データが出力されない場合(例えば、入力データのハッシュ値に関連付けられた辞書アドレスがハッシュテーブル23に記憶されていない場合)、一致比較器24は入力データをそのまま検索結果として出力する。
【0056】
一致比較器24によって検索結果が出力された後、辞書バッファ21は、検索部151Aに対する現在の入力データを、辞書バッファ21内の複数の記憶領域の1つに記憶する。そして、辞書バッファ21は、入力データが記憶された記憶領域を特定する辞書アドレスを、ハッシュテーブル23に出力する。辞書バッファ21がハッシュテーブル23に対して出力する辞書アドレスを、辞書ライトアドレスとも称する。
【0057】
ハッシュテーブル23は、入力データのハッシュ値を用いて特定した記憶領域に、辞書バッファ21によって出力された辞書ライトアドレスを記憶する。入力データのハッシュ値を用いて特定した記憶領域に辞書ライトアドレスを記憶することにより、ハッシュテーブル23では、入力データのハッシュ値に、その入力データが記憶されている辞書アドレスが関連付けられる。
【0058】
ここで、検索部151A内の各部の動作によって、ハッシュによる検索を説明する。ハッシュによる検索は、例えば、(1)辞書への文字列の登録、(2)辞書データの取得、および(3)文字列の一致評価の3つのステージで構成される。各ステージにおける検索部151Aの動作は以下の通りである。
【0059】
(1)辞書への文字列の登録
辞書バッファ21は入力文字列を記憶する。ハッシュ計算部22は、ハッシュ関数を用いて、入力文字列の先頭のN文字のハッシュ値を計算する。ハッシュテーブル23は、計算したハッシュ値をアドレスとして特定される、ハッシュテーブル23内の記憶領域に、入力文字列が記憶された辞書バッファ21のアドレス(辞書ライトアドレス)を記憶する。
【0060】
(2)辞書データの取得
ハッシュテーブル23は、入力文字列の先頭のN文字のハッシュ値をアドレスとして、ハッシュテーブル23内の記憶領域を特定する。ハッシュテーブル23は、特定した記憶領域に記憶されている辞書アドレス(辞書リードアドレス)を、辞書バッファ21に出力する。辞書バッファ21は、ハッシュテーブル23によって出力された辞書リードアドレスを用いて、辞書バッファ21内の記憶領域を特定する。辞書バッファ21は、特定した記憶領域に記憶されている文字列(辞書文字列)を、一致比較器24に出力する。
【0061】
(3)文字列の一致評価
一致比較器24は入力文字列と辞書文字列とを比較する。入力文字列と辞書文字列とで一致する部分がある場合、一致比較器24は辞書リードアドレスと一致長とを出力する。入力文字列と辞書文字列とで一致する部分がない場合、一致比較器24は入力文字列を出力する。
【0062】
図4から
図6を参照して、ハッシュによる検索の具体例をさらに説明する。
【0063】
図4は、ハッシュテーブル23および辞書バッファ21を用いて入力データを登録する例を示す。
図4に示す例は、前述したハッシュによる検索方法の(1)辞書への文字列の登録のステージに相当する。ここでは、検索部151Aに対する入力データとして、“This is a pen.”が入力されている。
【0064】
辞書バッファ21は入力データ“This is a pen.”を記憶する。辞書バッファ21において、入力データが記憶される記憶領域は、例えば、直前に入力されたデータが記憶された記憶領域に後続する記憶領域である。辞書バッファ21内の複数の記憶領域は、例えば、アドレスがより小さい記憶領域から順に、入力データの格納に用いられる。ここでは、入力データは、辞書バッファ21内のアドレス100の記憶領域に記憶されている。辞書バッファ21はアドレス100をハッシュテーブル23に出力する。
【0065】
ハッシュ計算部22はハッシュ関数Hを用いて、入力データの先頭の4文字(すなわち4バイト)である“This”のハッシュ値H(This)を計算する。ハッシュ計算部22はハッシュ値H(This)をハッシュテーブル23に出力する。なお、ここでは、現在の入力データが入力されるよりも前には、ハッシュ値H(This)で特定されるハッシュテーブル23内の記憶領域に、いずれのデータ(すなわち辞書アドレス)も記憶されていないことを想定する。
【0066】
ハッシュテーブル23は、ハッシュ値H(This)で特定されるハッシュテーブル23内の記憶領域に、辞書バッファ21から出力された辞書アドレス100を記憶する。つまり、ハッシュテーブル23内のアドレスH(This)の記憶領域に、辞書アドレス100が記憶される。これにより、ハッシュテーブル23において、入力データのハッシュ値H(This)に、入力データが記憶されている辞書アドレス100が関連付けられる。
【0067】
図5は、
図4に示したハッシュテーブル23を用いて、新たな入力データを辞書バッファ21内のデータと比較する例を示す。
図5に示す例は、前述したハッシュによる検索方法の(2)辞書データの取得および(3)文字列の一致評価のステージに相当する。ここでは、検索部151Aに対する入力データとして、“This is a c++.”が入力されている。
【0068】
ハッシュ計算部22はハッシュ関数Hを用いて、入力データの先頭の4文字である“This”のハッシュ値H(This)を計算する。ハッシュ計算部22はハッシュ値H(This)をハッシュテーブル23に出力する。
【0069】
ハッシュテーブル23は、ハッシュ値H(This)に関連付けられた辞書アドレス100を辞書バッファ21に出力する。つまり、ハッシュテーブル23は、アドレスH(This)の記憶領域に記憶されている辞書アドレス100を辞書バッファ21に出力する。
【0070】
辞書バッファ21は、辞書アドレス100に記憶されているデータ(辞書データ)“This is a pen.”を一致比較器24に出力する。
【0071】
一致比較器24は、入力データ“This is a c++.”と、辞書データ“This is a pen.”とを比較して、一致長を得る。一致長は、例えば、入力データと辞書データとで先頭から連続して一致した部分“This is a ”の長さ(ここでは、10)である。なお、一致長はスペースも含む。一致比較器24は、例えば、辞書アドレスと一致長の組を示す(100,10)を、検索結果として出力する。
【0072】
図6は、
図4に示したハッシュテーブル23および辞書バッファ21を用いて、入力データ“This is a c++.”を登録する例を示す。
【0073】
具体的には、辞書バッファ21は入力データ“This is a c++.”を記憶する。ここでは、入力データは、辞書アドレス101の記憶領域に記憶されている。辞書バッファ21は辞書アドレス101をハッシュテーブル23に出力する。
【0074】
ハッシュテーブル23は、ハッシュ値H(This)で特定されるハッシュテーブル23内の記憶領域に、辞書バッファ21から出力された辞書アドレス101を記憶する。つまり、ハッシュテーブル23内のアドレスH(This)の記憶領域に、辞書アドレス101が記憶(上書き)される。これにより、ハッシュテーブル23において、入力データのハッシュ値H(This)に、入力データが記憶されている辞書アドレス101が関連付けられる。つまり、ハッシュ値H(This)を、過去の入力データ“This is a pen.”が記憶されている辞書アドレス100ではなく、現在の入力データ“This is a c++.”が記憶されている辞書アドレス101に関連付けるように、ハッシュテーブル23が更新される。
【0075】
図5を参照して前述したように、ハッシュによる検索方法では、検索部151Aは、ハッシュ値を利用して辞書バッファ21から1つの辞書データを取得し、取得した1つの辞書データのみを入力データと比較すればよい。したがって、ハッシュによる検索方法の探索コストは、全探索による探索コストよりも小さい。
【0076】
しかしながら、ハッシュ値を利用する場合、ハッシュの衝突により、辞書バッファ21内に記憶されているはずのデータを検索できなくなることがある。ハッシュの衝突が発生する場合の例を、
図7から
図9を参照して説明する。
【0077】
図7は、ハッシュテーブル23および辞書バッファ21を用いて入力データを登録する別の例を示す。
図7に示す例では、検索部151Aに対する入力データとして、“This is a hat.”が入力されている。
【0078】
図7に示す例では、
図4を参照して前述した例と同様にして、入力データ“This is a hat.”が辞書に登録される。すなわち、辞書バッファ21は、辞書アドレス100に入力データを記憶する。そして、ハッシュテーブル23は、入力データの先頭の4文字のハッシュ値H(This)に関連付けて、辞書アドレス100を記憶する。
【0079】
ここで、ハッシュ値の計算に用いるハッシュ関数Hが、H(This)=H(That)となるハッシュ関数であることを想定する。つまり、ハッシュ関数Hは、“This”で始まる入力データと、“That”で始まる入力データとで、ハッシュの衝突が発生する関数である。
【0080】
図8は、
図7に示した入力データ“This is a hat.”の辞書への登録の後に、新たな入力データを登録する例を示す。
図8に示す例では、検索部151Aに対する新たな入力データとして、“That is a hut.”が入力されている。
【0081】
辞書バッファ21は入力データ“That is a hut.”を記憶する。ここでは、入力データは、辞書アドレス200の記憶領域に記憶されている。辞書バッファ21は辞書アドレス200をハッシュテーブル23に出力する。
【0082】
ハッシュ計算部22はハッシュ関数Hを用いて、入力データのハッシュ値H(That)を計算する。ハッシュ計算部22は、ハッシュ値H(That)をハッシュテーブル23に出力する。
【0083】
ハッシュテーブル23は、ハッシュ値H(That)で特定されるハッシュテーブル23内の記憶領域に、辞書バッファ21から出力された辞書アドレス200を記憶(上書き)する。つまり、ハッシュテーブル23内のアドレスH(That)の記憶領域に、辞書アドレス200が記憶される。これにより、ハッシュテーブル23において、入力データのハッシュ値H(That)に、入力データが記憶されている辞書アドレス200が関連付けられる。
【0084】
このように、H(This)=H(That)であるハッシュの衝突によって、過去の入力データ“This is a hat.”の辞書アドレス100は、ハッシュテーブル23から追い出される。これは、以降の入力データのハッシュ値としてH(This)が計算されたとしても、辞書バッファ21のアドレス100に記憶されているデータ“This is a hat.”にアクセスされないことを意味する。したがって、過去の入力データ“This is a hat.”は、辞書バッファ21のアドレス100に記憶されているにも関わらず、新たな入力データとの比較に利用されなくなる。
【0085】
図9は、
図8に示したハッシュテーブル23および辞書バッファ21を用いて、新たな入力データを辞書バッファ21内のデータと比較する例を示す。
図9に示す例では、検索部151Aに対する入力データとして、“This is a hat.”が入力されている。
【0086】
ハッシュ計算部22はハッシュ関数Hを用いて、入力データの先頭の4文字である“This”のハッシュ値H(This)を計算する。ハッシュ計算部22はハッシュ値H(This)をハッシュテーブル23に出力する。
【0087】
ハッシュテーブル23は、ハッシュ値H(This)に関連付けられた辞書アドレス200を辞書バッファ21に出力する。つまり、ハッシュテーブル23は、アドレスH(This)の記憶領域に記憶されている辞書アドレス200を辞書バッファ21に出力する。
【0088】
辞書バッファ21は、辞書アドレス200に記憶されているデータ(辞書データ)“That is a hut.”を一致比較器24に出力する。
【0089】
一致比較器24は、入力データ“This is a hat.”と、辞書データ“That is a hut.”とを比較して、先頭から連続して一致した部分“Th”の長さ(ここでは、2)を得る。一致比較器24は、例えば、辞書アドレスと一致長の組を示す(200,2)を、検索結果として出力する。これは、検索部151Aによる辞書式符号化によって、入力データの先頭の2文字“Th”が、検索結果(200,2)に変換されたものの、残りの文字列“is is a hat.”は辞書アドレスと一致長の組に変換できなかったことを意味する。
【0090】
辞書バッファ21のアドレス100には、辞書データ“This is a hat.”が記憶されている。そのため、H(This)=H(That)であるハッシュの衝突が発生していなければ、一致比較器24は、辞書バッファ21のアドレス100に記憶されている、入力データと完全に一致する辞書データを取得して、入力データと辞書データの一致長として、データ全体の長さである14を得る。この場合、一致比較器24は、辞書アドレスと一致長の組を示す(100,14)を、検索結果として出力する。これは、検索部151Aによる辞書式符号化によって、入力データ全体を検索結果(100,14)に変換できたことを意味する。
【0091】
このように、H(This)=H(That)であるハッシュの衝突が発生した場合、入力データ“This is a hat.”と比較される対象として、辞書バッファ21から、辞書データ“This is a hat.”ではなく、辞書データ“That is a hut.”が取得されるので、辞書バッファ21の検索精度の低下が発生する。そして、入力データ“This is a hat.”が辞書データ“That is a hut.”と比較されることで、辞書データ“This is a hat.”と比較される場合よりも、辞書アドレスと一致長の組に変換される入力データ内の文字列が短くなる。そのため、例えば、辞書アドレスと一致長の組への変換を利用して、入力データを圧縮する場合、圧縮効率が低下する可能性がある。
【0092】
そこで、本実施形態の圧縮装置15の検索部151は、入力データに含まれる1つ以上の特定の単位(例えばバイト単位)のデータ部において、値が全く変化しないビット位置がある場合、入力データのハッシュ値の計算に用いるハッシュ関数として、そのビット位置の値を用いないハッシュ関数を決定する。なお、検索部151は、入力データに含まれる1つ以上の特定の単位のデータ部において、値が0である割合が第1閾値以上であるビット位置が存在する場合に、入力データのハッシュ値の計算に用いるハッシュ関数として、そのビット位置の値を用いないハッシュ関数を決定してもよい。あるいは、検索部151は、入力データに含まれる1つ以上の特定の単位のデータ部において、値が1である割合が第1閾値以上であるビット位置が存在する場合に、入力データのハッシュ値の計算に用いるハッシュ関数として、そのビット位置の値を用いないハッシュ関数を決定してもよい。このようなハッシュ関数の決定により、ハッシュの衝突が起きる確率を低減できる。
【0093】
図10および
図11を参照して、ハッシュ関数とハッシュの衝突の関係について、具体的に説明する。
【0094】
図10は、ハッシュの衝突を発生させるハッシュ関数H’の例を示す。ここでは、ハッシュ関数に対する入力が、2文字(2バイト)のデータ“AB”である場合を例示する。
【0095】
2文字のデータ“AB”は、文字“A”に対応する8ビットのビットデータ列{a7,a6,a5,a4,a3,a2,a1,a0}と、文字“B”に対応する8ビットのビットデータ列{b7,b6,b5,b4,b3,b2,b1,b0}とで構成される。anは、文字“A”を構成するビット値の1つを示す。bnは、文字“B”を構成するビット値の1つを示す。添え字nは、1つの文字を構成するビットデータ列における順序(位置)を示し、上位ビットほど大きな値となる。添え字nは、0から7までのいずれかの値である。なお、添え字nを用いて、ビットデータ列を構成する1つのビットを、第nビットとも称する。
【0096】
ハッシュ関数H’は、入力データを文字単位(バイト単位)に分割した複数のデータ部の排他的論理和(XOR)を出力する。より詳しくは、ハッシュ関数H’は、文字単位の複数のデータ部を用いて、ビット位置毎の複数のビット値の排他的論理和を出力する。すなわち、ハッシュ関数H’にデータ“AB”を入力して得られるハッシュ値H’(AB)は、次式で表される。
H’(A,B)=A^B={a7^b7,a6^b6,a5^b5,a4^b4,a3^b3,a2^b2,a1^b1,a0^b0}
なお、記号“^”は、排他的論理和の演算を表す。
【0097】
ここで、入力データがテキストデータである場合を考える。テキストデータはASCIIコードで記述されたデータである。ASCIIコードは、0から127までのいずれかの値である。つまり、ASCIIコードは、最上位ビット(第7ビット)が常に0であるデータである。
【0098】
ビットデータ列の具体的な値を用いて、ハッシュ値を計算する例を示す。例えば、A=8’b0111_1101、B=8’b0000_0010、X=8’b0111_1111、Y=8’b0000_0000であることを想定する。なお、“8’b”に後続する、各々が0または1である8つの値は、8ビットのビットデータ列を示している。
【0099】
ハッシュ関数H’を用いて計算される、データ“AB”のハッシュ値H’(AB)と、データ“XY”のハッシュ値H’(XY)とは、以下の通りである。
H’(AB)=8’b0111_1101^8’b0000_0010
=8’b0111_1111
H’(XY)=8’b0111_1111^8’b0000_0000
=8’b0111_1111
このように、ハッシュ関数H’を用いたハッシュ値の計算では、データ“AB”のハッシュ値H’(AB)とデータ“XY”のハッシュ値H’(XY)とが同一の値になり、ハッシュの衝突が起きる。
【0100】
そのため、本実施形態の圧縮装置15では、入力データがテキストデータであると判断した場合に、入力データに含まれる文字単位(すなわち1バイト単位)のデータ部の最上位ビットが常に0であることに着目する。具体的には、圧縮装置15の検索部151は、文字単位の複数のデータ部の全ビット値を用いて、ビット位置毎の排他的論理和を計算するハッシュ関数H’ではなく、最上位ビットを用いないハッシュ関数Hを、入力データのハッシュ値を計算するハッシュ関数に決定する。ハッシュ関数Hは、例えば、最上位ビットの排他的論理和を計算する代わりに、最上位ビット以外のビットの排他的論理和を計算するように構成される。
【0101】
図11は、ハッシュの衝突が起きる確率を低下させるハッシュ関数Hの例を示す。ハッシュ関数Hに入力されるデータの一例であるデータ“AB”については、
図10を参照して前述した通りである。
【0102】
図11に示すように、文字“A”に対応するビットデータ列の最上位ビットa7の値は、常に0である。また、文字“B”に対応するビットデータ列の最上位ビットb7の値は、常に0である。
【0103】
そのため、検索部151は、最上位ビットa7およびb7を用いないハッシュ関数Hを、入力データのハッシュ値を計算するハッシュ関数に決定する。
図11に示す例では、ハッシュ関数Hは、最上位ビットa7およびb7の排他的論理和を計算する代わりに、文字“A”の第1ビットa1と、文字“B”の第0ビットb0との排他的論理和を計算するように構成されている。したがって、ハッシュ関数Hにデータ“AB”を入力して得られるハッシュ値H(AB)は、次式で表される。
H(AB)={a1^b0,a6^b6,a5^b5,a4^b4,a3^b3,a2^b2,a1^b1,a0^b0}
検索部151は、入力データがテキストデータであると判断した場合、入力データのハッシュ値を計算するハッシュ関数を、例えばハッシュ関数H’からハッシュ関数Hに変更する。
【0104】
ビットデータ列の具体的な値を用いて、ハッシュ値を計算する例を示す。
図10を参照して前述した例と同様に、A=8’b0111_1101、B=8’b0000_0010、X=8’b0111_1111、Y=8’b0000_0000であることを想定する。
【0105】
ハッシュ関数Hを用いて計算される、データ“AB”のハッシュ値H(AB)と、データ“XY”のハッシュ値H(XY)とは、以下の通りである。
H(AB)=8’b0111_1101^8’b0000_0010
=8’b0111_1111
H(XY)=8’b1111_1111^8’b0000_0000
=8’b1111_1111
このように、ハッシュ関数Hを用いたハッシュ値の計算では、データ“AB”のハッシュ値H(AB)とデータ“XY”のハッシュ値H(XY)とは異なる値になり、ハッシュの衝突が回避できる。
【0106】
ハッシュの衝突が起きる可能性を抑制できることにより、検索部151が、入力データと比較される対象として適切な辞書データを辞書バッファ21から取得できる可能性が高まる。つまり、辞書バッファ21の検索精度が向上する。したがって、例えば、辞書バッファ21を用いて、入力データを辞書アドレスと一致長の組に変換することを利用して、入力データを圧縮する場合に、圧縮効率が向上する。
【0107】
前述した例では、説明を分かりやすくするために、簡単なハッシュ関数の例を示したが、実際にはより複雑なハッシュ関数が用いられ得る。どのようなハッシュ関数を用いる場合でも、入力データに含まれる特定の単位のデータ部に、出現する値に偏りがあるビットがあるならば、検索部151は、そのビットを用いないハッシュ関数に変更する。これにより、ハッシュの衝突の可能性を低減できる。
【0108】
図12は検索部151の構成の一例を示す。検索部151は、データ判断部20、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、および一致比較器24を備える。
【0109】
データ判断部20およびハッシュ計算部22は、入力データに基づいて、入力データに対して用いるべきハッシュ関数を決定する。ハッシュ計算部22は、決定したハッシュ関数と、入力データの少なくとも一部とを用いて、ハッシュ値を計算する。
【0110】
以下に、データ判断部20およびハッシュ計算部22の各々の動作について、具体的に説明する。
【0111】
まず、データ判断部20は入力データを受け付ける。データ判断部20は、入力データがどのようなデータであるかを判断する。具体的には、データ判断部20は、例えば、入力が開始されてからNバイトのデータを保持する。Nは1以上の整数である。そして、データ判断部20は、Nバイトのデータを解析(評価)して、入力データの種別、入力データを構成する1つ以上の特定の単位のデータ部において値の偏りがあるビット(ビット位置)の有無、等を判断する。入力データの種別は、例えばファイル形式である。特定の単位のデータ部は、例えば1バイト単位のデータ部(すなわち1文字単位のデータ部)である。
【0112】
データ判断部20は、入力データに関する判断結果に基づいて、ハッシュ計算部22が用いるハッシュ関数を決定するための情報を生成する。ハッシュ関数を決定するための情報を、ハッシュ関数情報とも称する。ハッシュ関数情報は、例えばハッシュ関数そのものを示す情報を含む。あるいは、ハッシュ関数情報は、複数のハッシュ関数から1つのハッシュ関数を選択するための情報(例えばハッシュ関数の識別情報)であってもよい。
【0113】
データ判断部20は、生成したハッシュ関数情報をハッシュ計算部22に出力する。また、データ判断部20は入力データを、ハッシュ計算部22、一致比較器24、および辞書バッファ21にそれぞれ出力する。
【0114】
データ判断部20が入力データを解析してハッシュ関数情報を生成する幾つかの例を説明する。
【0115】
(1)常に0であるビットまたは常に1であるビットを含むデータ部で構成される入力データ
データ判断部20は、入力データを構成するバイト単位のN個のデータ部において、第iビットが常に0であること、または第iビットが常に1であることを検知する。なお、iは、0以上であってm未満である整数である。N個のデータ部の各々が8ビット(=1バイト)の長さを有する場合、mは8である。
【0116】
バイト単位のN個のデータ部において、第iビットが常に0であることを検知した場合、データ判断部20は、第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。また、バイト単位のN個のデータ部において、第iビットが常に1であることを検知した場合、データ判断部20は、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。
【0117】
(2)0である割合が高いビットまたは1である割合が高いビットを含むデータ部で構成される入力データ
データ判断部20は、入力データを構成するバイト単位のN個のデータ部にそれぞれ含まれるN個の第iビットの内、値が0であるビットの割合(以下、第iビットが0である割合と称する)、またはN個の第iビットの内、値が1であるビットの割合(以下、第iビットが1である割合と称する)を計算する。そして、データ判断部20は、第iビットが0である割合または第iビットが1である割合が第1閾値(例えば95%)以上である場合、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。あるいは、データ判断部20は、データ部の第iビットを用いる回数(あるいは頻度)が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0118】
また、データ判断部20は、第iビットが0である割合が、第iビット以外の各ビットが0である割合よりも高い場合に、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報、またはデータ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0119】
さらに、データ判断部20は、第iビットが1である割合が、第iビット以外の各ビットが1である割合よりも高い場合に、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報、またはデータ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0120】
(3)0である割合が低いビットまたは1である割合が低いビットを含むデータ部で構成される入力データ
データ判断部20は、入力データを構成するバイト単位のN個のデータ部にそれぞれ含まれるN個の第iビットの内、値が0であるビットの割合(以下、第iビットが0である割合と称する)、またはN個の第iビットの内、値が1であるビットの割合(以下、第iビットが1である割合と称する)を計算する。そして、データ判断部20は、第iビットが0である割合または第iビットが1である割合が第2閾値(例えば5%)以下である場合、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。あるいは、データ判断部20は、データ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0121】
また、データ判断部20は、第iビットが0である割合が、第iビット以外の各ビットが0である割合よりも低い場合に、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報、またはデータ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0122】
さらに、データ判断部20は、第iビットが1である割合が、第iビット以外の各ビットが1である割合よりも低い場合に、データ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報、またはデータ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0123】
なお、各ビットの値は0と1のいずれかであるので、(2)で記載した第iビットが0である割合が第1閾値以上であることは、(3)で記載した第iビットが1である割合が第2閾値以下であることと同義である。また、(2)で記載した第iビットが1である割合が第1閾値以上であることは、(3)で記載した第iビットが0である割合が第2閾値以下であることと同義である。
【0124】
次いで、ハッシュ計算部22は、データ判断部20によって生成されたハッシュ関数情報を用いて、入力データのハッシュ値の計算に用いるハッシュ関数を決定する。ハッシュ計算部22は、決定したハッシュ関数を用いて、ファイルのような入力データ全体の内の、例えば特定単位の入力データ(すなわち現在の入力データ)の少なくとも一部のハッシュ値を計算する。ハッシュ計算部22は、計算したハッシュ値をハッシュテーブル23に出力する。
【0125】
図12に示す辞書バッファ21、ハッシュテーブル23、および一致比較器24の動作は、
図3を参照して前述した検索部151Aの辞書バッファ21、ハッシュテーブル23、および一致比較器24の動作とそれぞれ同様である。
【0126】
図13は、データ判断部20およびハッシュ計算部22の具体的な動作例を示す。
図13に示す例では、データ判断部20に対して、入力データ“Alice was beginning to get very tired of sitting by her sister on the bank”が入力されている。
【0127】
データ判断部20は、入力データの先頭のNバイトのデータを解析する。Nは、1から入力データ全体の長さ(ここでは74)までのいずれかの値である。例えばN=19である場合、データ判断部20は、先頭から19バイトのデータ“Alice was beginning”を解析する。
【0128】
より具体的には、データ判断部20は、Nバイトのデータを分割して、文字単位(すなわちバイト単位)の複数のデータ部を得る。そして、データ判断部20は、複数のデータ部が全てASCIIコードであるか否かを判定する。ASCIIコードは、0から127までのいずれかの値である。データ部がASCIIコードであるならば、そのデータ部の最上位ビットは0である。したがって、データ判断部20は、複数のデータ部の各々の最上位ビットが全て0であるか否かを判定することで、複数のデータ部が全てASCIIコードであるか否かを判定する。
【0129】
複数のデータ部の各々の最上位ビットが全て0である場合、すなわち複数のデータ部が全て0から127までのいずれかの値である場合、データ判断部20は、入力データがASCIIコードで構成されるテキストデータであると判断する。入力データがテキストデータであると判断したことに応じて、データ判断部20は、データ部の最上位ビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。生成されたハッシュ関数情報を用いることで、ハッシュ計算部22は、データ部の最上位ビットを用いないハッシュ関数を、入力データのハッシュ値の計算に用いるハッシュ関数に決定できる。
【0130】
複数のデータ部の少なくとも1つの最上位ビットが1である場合、すなわち複数のデータ部の少なくとも1つがASCIIコード以外の値である場合、データ判断部20は、入力データがテキストデータではないと判断する。ASCIIコード以外の値は、128から255までのいずれかの値である。入力データがテキストデータではないと判断したことに応じて、データ判断部20は、データ部の全ビットを用いるハッシュ関数を決定するためのハッシュ関数情報を生成する。生成されたハッシュ関数情報を用いることで、ハッシュ計算部22は、データ部の全ビットを用いるハッシュ関数を、入力データのハッシュ値の計算に用いるハッシュ関数に決定できる。
【0131】
図12および
図13に示した構成により、検索部151は、ハッシュの衝突が起きる確率を低下させて、辞書バッファ21の検索精度を向上できる。したがって、例えば、辞書バッファ21を用いて、入力データを辞書アドレスと一致長の組に変換することを利用して、入力データを圧縮する場合に、圧縮効率が向上する。
【0132】
図14は、圧縮装置15の検索部151において実行される検索処理の手順の例を示すフローチャートである。検索処理は、辞書バッファ21を検索して、入力データXに対する辞書式符号化を行うための処理である。
【0133】
まず、検索部151は、入力データXに対するハッシュ関数情報生成処理を実行する(ステップS101)。ハッシュ関数情報生成処理は、入力データXを用いてハッシュ関数情報を生成するための処理である。ハッシュ関数情報は、入力データXのハッシュ値の計算に用いるハッシュ関数を決定するための情報である。ハッシュ関数情報生成処理の具体的な手順については、
図15のフローチャートを参照して後述する。
【0134】
検索部151は、生成したハッシュ関数情報を用いてハッシュ関数Hを決定する(ステップS102)。検索部151はハッシュ関数情報を用いて、例えばハッシュ関数Hを生成する。あるいは、検索部151はハッシュ関数情報を用いて、予め用意された複数のハッシュ関数から1つのハッシュ関数Hを選択してもよい。
【0135】
検索部151は、決定したハッシュ関数Hを用いて、入力データXのハッシュ値H(X)を計算する(ステップS103)。検索部151は、例えば、ハッシュ関数Hと、入力データXの内の少なくとも一部とを用いて、ハッシュ値H(X)を計算する。入力データXの内の少なくとも一部は、例えば、入力データXの先頭からNバイトのデータである。
【0136】
次いで、検索部151は、ハッシュテーブル23のアドレスH(X)に、辞書バッファ21のアドレスが記憶されているか否かを判定する(ステップS104)。検索部151は、計算した入力データXのハッシュ値H(X)を、ハッシュテーブル23内の記憶位置を特定するアドレスとして用いている。
【0137】
ハッシュテーブル23のアドレスH(X)に、辞書バッファ21のアドレスが記憶されている場合(ステップS104のYES)、検索部151は、ハッシュテーブル23のアドレスH(X)に記憶されているアドレス(以下、第1アドレスと称する)を取得する(ステップS105)。検索部151は、辞書バッファ21の第1アドレスに記憶されている辞書データを取得する(ステップS106)。そして、検索部151は、入力データXと、取得した辞書データとを比較して、比較結果をエントロピー符号化部152に出力する(ステップS107)。比較結果は、例えば、第1アドレスと、入力データXと辞書データとの一致長を含む。
【0138】
次いで、検索部151は、辞書バッファ21の第2アドレスに入力データXを格納する(ステップS108)。第2アドレスは、第1アドレスとは異なるアドレスである。第2アドレスは、例えば、1つ前の入力データが記憶されている記憶領域に後続する記憶領域を示すアドレスである。検索部151は、ハッシュテーブル23のアドレスH(X)に第2アドレスを格納し(ステップS109)、ステップS113に進む。
【0139】
また、ハッシュテーブル23のアドレスH(X)に、辞書バッファ21のアドレスが記憶されていない場合(ステップS104のNO)、検索部151は入力データXをエントロピー符号化部152に出力する(ステップS110)。検索部151は、辞書バッファ21の第2アドレスに入力データXを格納する(ステップS111)。そして、検索部151は、ハッシュテーブル23のアドレスH(X)に第2アドレスを格納し(ステップS112)、ステップS113に進む。
【0140】
次いで、検索部151は後続する入力データXがあるか否かを判定する(ステップS113)。後続する入力データXがある場合(ステップS113のYES)、検索部151はステップS103に戻り、後続する入力データXの辞書式符号化のための処理を行う。後続する入力データXのハッシュ値の計算には、ステップS102で既に決定されたハッシュ関数Hが用いられる。
【0141】
一方、後続する入力データXがない場合(ステップS113のNO)、検索部151は検索処理を終了する。
【0142】
以上の
図14の検索処理により、検索部151は、辞書バッファ21を検索して、入力データXに対する辞書式符号化を行うことができる。具体的には、入力データXと少なくとも一部が一致するデータが辞書バッファ21に記憶されている場合、検索部151は入力データXを辞書アドレスと一致長との組に変換できる。入力データXと少なくとも一部が一致するデータが辞書バッファ21に記憶されていない場合、検索部151は入力データXをそのまま出力する。
【0143】
また、検索部151は、入力データXを辞書バッファ21に新たに登録できる。すなわち、検索部151は、入力データXを辞書バッファ21に格納した後、ハッシュ値H(X)を利用して辞書バッファ21に記憶された入力データXにアクセスできるように、ハッシュテーブル23に、入力データXが記憶された辞書アドレス(第2アドレス)を格納する。これにより、検索部151は、以降の入力データの辞書式符号化に、辞書バッファ21に登録された入力データXを利用できる。
【0144】
図15は、圧縮装置15の検索部151において実行されるハッシュ関数情報生成処理の手順の例を示すフローチャートである。ハッシュ関数情報生成処理は、入力データXを用いてハッシュ関数情報を生成するための処理である。ハッシュ関数情報は、入力データXのハッシュ値の計算に用いるハッシュ関数を決定するための情報である。ハッシュ関数情報生成処理は、
図14のフローチャートを参照して前述した検索処理のステップS101に相当する。ここでは、説明を分かりやすくするために、入力データXがテキストデータであるかどうかに応じたハッシュ関数情報を生成する場合について例示する。
【0145】
まず、検索部151は、入力データXの先頭からNバイトのデータを取得する(ステップS21)。Nは、1から入力データXのバイト単位の長さまでの整数である。そして、検索部151はNバイトのデータから、N個のバイト単位のデータ部を取得する(ステップS22)。
【0146】
次いで、検索部151は、取得したN個のデータ部の内、最上位ビットが0であるデータ部の割合が閾値以上であるか否かを判定する(ステップS23)。例えば、全てのデータ部が文字のデータであるか否かを判定するならば、すなわち全てのデータ部で最上位ビットが0であるか否かを判定するならば、閾値は1(=100%)である。
【0147】
N個のデータ部の内、最上位ビットが0であるデータ部の割合が閾値以上である場合(ステップS23のYES)、検索部151は、データ部の最上位ビットを用いないことを示すハッシュ関数情報を生成し(ステップS24)、ハッシュ関数情報生成処理を終了する。つまり、検索部151は、入力データXがテキストデータであると判断して、データ部の最上位ビットを用いないことを示すハッシュ関数情報を生成する。
【0148】
一方、N個のデータ部の内、最上位ビットが0であるデータ部の割合が閾値未満である場合(ステップS23のNO)、検索部151は、データ部の全ビットを用いることを示すハッシュ関数情報を生成し(ステップS25)、ハッシュ関数情報生成処理を終了する。つまり、検索部151は、入力データXがテキストデータではないと判断して、データ部の全ビットを用いることを示すハッシュ関数情報を生成する。
【0149】
以上の
図15のハッシュ関数情報生成処理により、検索部151は、入力データXの内容に応じたハッシュ関数情報を生成できる。検索部151(より詳しくはハッシュ計算部22)は、生成したハッシュ関数情報を用いて、データ部の最上位ビットを用いないハッシュ関数と、データ部の全ビットを用いるハッシュ関数のいずれか一方を決定できる。
【0150】
なお、検索部151は、ステップS23において、取得したN個のデータ部の内、第iビットが0であるデータ部の割合が第1閾値以上であるか否かを判定してもよい。iは、0以上であってm未満である整数である。ここでは、N個のデータ部の各々が8ビット(=1バイト)の長さを有するので、mは8である。検索部151は、例えばiを0から(m-1)まで1ずつ増加させることで、第0ビットから第(m-1)ビットの各々について、N個のデータ部の内、第iビットが0であるデータ部の割合が第1閾値以上であるか否かを判定する。
【0151】
検索部151は、N個のデータ部において、0である割合が第1閾値以上である第iビットが存在する場合、データ部の第iビットを用いないことを示すハッシュ関数情報を生成する。これにより、検索部151はハッシュ関数情報を用いて、データ部の第iビットを用いないハッシュ関数を決定できる。
【0152】
検索部151は、N個のデータ部において、0である割合が閾値以上である第iビットが存在しない場合、データ部の全ビットを用いることを示すハッシュ関数情報を生成する。これにより、検索部151はハッシュ関数情報を用いて、データ部の全ビットを用いるハッシュ関数を決定できる。
【0153】
さらに、検索部151は、ステップS23において、取得したN個のデータ部の内、第iビットが1であるデータ部の割合が第1閾値以上であるか否かを判定してもよい。検索部151は、例えばiを0から(m-1)まで1ずつ増加させることで、第0ビットから第(m-1)ビットの各々について、N個のデータ部の内、第iビットが1であるデータ部の割合が閾値以上であるか否かを判定する。
【0154】
検索部151は、N個のデータ部において、1である割合が第1閾値以上である第iビットが存在する場合、データ部の第iビットを用いないことを示すハッシュ関数情報を生成する。これにより、検索部151はハッシュ関数情報を用いて、データ部の第iビットを用いないハッシュ関数を決定できる。
【0155】
検索部151は、N個のデータ部において、1である割合が第1閾値以上である第iビットが存在しない場合、データ部の全ビットを用いることを示すハッシュ関数情報を生成する。これにより、検索部151はハッシュ関数情報を用いて、データ部の全ビットを用いるハッシュ関数を決定できる。
【0156】
(第2実施形態)
第1実施形態では、検索部151は入力データの内容に応じたハッシュ関数情報を生成する。これに対して、第2実施形態では、検索部151は入力データ情報を用いてハッシュ関数情報を生成する。入力データ情報は、入力データの内容に関する情報である。
【0157】
第2実施形態に係る圧縮装置15の構成は第1実施形態の圧縮装置15と同様であり、第2実施形態と第1実施形態とでは、検索部151のデータ判断部20の動作のみが異なる。以下、第1実施形態と異なる点を主に説明する。
【0158】
図16は、第2実施形態の圧縮装置15に設けられる検索部151の構成例を示す。第2実施形態の検索部151は、第1実施形態の検索部151と同様に、データ判断部20、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、および一致比較器24を備える。
【0159】
データ判断部20は、入力データに加えて、入力データ情報を受け付ける。入力データ情報は、入力データを構成する特定の単位の1つ以上のデータ部において、出現する値に偏りがある第iビットに関連する情報である。より具体的には、入力データ情報は、入力データを構成する特定の単位の1つ以上のデータ部にそれぞれ含まれる1つ以上の第iビットの内、0であるビットの割合、または1つ以上の第iビットの内、1であるビットの割合に関連する情報である。第iビットは、特定の単位のデータ部を構成するビットデータ列におけるi番目のビットである。データ判断部20は入力データ情報を用いてハッシュ関数情報を生成する。データ判断部20は、生成したハッシュ関数情報と、入力データとを、ハッシュ計算部22に出力する。
【0160】
ハッシュ計算部22はハッシュ関数情報を用いて、入力データのハッシュ値の計算に用いるハッシュ関数を決定する。そして、ハッシュ計算部22は、決定したハッシュ関数情報を用いて、入力データのハッシュ値(より詳しくは、入力データの少なくとも一部のハッシュ値)を計算する。
【0161】
辞書バッファ21、ハッシュテーブル23、および一致比較器24の動作については、第1実施形態で説明した通りである。
【0162】
図17は、データ判断部20およびハッシュ計算部22の具体的な動作例を示す。まず、入力データ情報の幾つかの具体例を挙げて、データ判断部20の動作を説明する。
【0163】
(1)入力データ情報が入力データの形式を示す場合
入力データ情報は入力データの形式を示す。より具体的には、入力データ情報は、例えば、入力データがテキストデータ(テキストファイル)であることを示す。テキストデータでは、バイト単位(文字単位)のデータ部の最上位ビットが常に0である。そのため、入力データ情報が、入力データがテキストデータであることを示す場合、データ判断部20は、バイト単位のデータ部の最上位ビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。
【0164】
また、入力データ情報は、例えば、入力データがテキストデータではないこと、または入力データがテキストデータとは別の形式のデータ(ファイル)であることを示し得る。入力データ情報が、入力データがテキストデータでないことを示す場合、データ判断部20は、データ部の全ビットを用いるハッシュ関数を決定するためのハッシュ関数情報を生成する。
【0165】
(2)入力データ情報が常に0であるビットまたは常に1であるビットを示す場合
入力データ情報は、例えば、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが常に0であることを示す。データ判断部20は、第iビットが常に0であることを示す入力データ情報を用いて、特定の単位のデータ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。
【0166】
例えば、入力データがテキストデータである場合に、入力データ情報は、入力データを構成するバイト単位(すなわち文字単位)のデータ部において、最上位ビット(第7ビット)が常に0であることを示してもよい。データ判断部20は、最上位ビットが常に0であることを示す入力データ情報を用いて、バイト単位のデータ部の最上位ビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。
【0167】
入力データ情報が、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが常に1であることを示す場合についても同様である。
【0168】
(3)入力データ情報が0である割合が高いビットまたは1である割合が高いビットを示す場合
入力データ情報は、例えば、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが0である割合が高いことを示す。より詳しくは、入力データ情報は、第iビットが0である割合を示す情報を含んでいてもよいし、第iビットが0である割合が第1閾値(例えば95%)以上であることを示す情報を含んでいてもよい。あるいは、入力データ情報は、第iビットが0である割合が、第iビット以外の各ビットが0である割合よりも高いことを示してもよい。
【0169】
データ判断部20は、第iビットが0である割合が高いことを示す入力データ情報を用いて、特定の単位のデータ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。あるいは、データ判断部20は、第iビットが0である割合が高いことを示す入力データ情報を用いて、特定の単位のデータ部の第iビットを用いる回数(あるいは頻度)が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0170】
入力データ情報が、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが1である割合が高いことを示す場合についても同様である。
【0171】
(4)入力データ情報が0である割合が低いビットまたは1である割合が低いビットを示す場合
入力データ情報は、例えば、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが0である割合が低いことを示す。より詳しくは、入力データ情報は、第iビットが0である割合を示す情報を含んでいてもよいし、第iビットが0である割合が第2閾値(例えば5%)以下であることを示す情報を含んでいてもよい。あるいは、入力データ情報は、第iビットが0である割合が、第iビット以外の各ビットが0である割合よりも低いことを示してもよい。
【0172】
データ判断部20は、第iビットが0である割合が低いことを示す入力データ情報を用いて、特定の単位のデータ部の第iビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。あるいは、データ判断部20は、第iビットが0である割合が低いことを示す入力データ情報を用いて、特定の単位のデータ部の第iビットを用いる回数が、第iビット以外の各ビットを用いる回数よりも少ないハッシュ関数を決定するためのハッシュ関数情報を生成してもよい。
【0173】
入力データ情報が、入力データを構成する特定の単位の1つ以上のデータ部において、第iビットが1である割合が低いことを示す場合についても同様である。
【0174】
なお、各ビットの値は0と1のいずれかであるので、(3)で記載した第iビットが0である割合が高いことは、(4)で記載した第iビットが1である割合が低いことと同義である。また、(3)で記載した第iビットが1である割合が高いことは、(4)で記載した第iビットが0である割合が低いことと同義である。
【0175】
以上の(1)から(4)で説明した入力データ情報は例示であって、入力データ情報は、入力データを構成する特定の単位の1つ以上のデータ部において、出現する値に偏りがあるビットを、直接または間接に示す情報であれば、どのような形態の情報であってもよい。
【0176】
ハッシュ計算部22は、データ判断部20によって生成されたハッシュ関数情報に従って、入力データのハッシュ値の計算に用いるハッシュ関数を決定する。そして、ハッシュ計算部22は、決定したハッシュ関数を用いて、入力データのハッシュ値を計算する。
【0177】
図16および
図17に示した構成により、入力データを構成するデータ部において、出現する値に偏りがあるビットが存在する場合、検索部151は入力データ情報を用いて、ハッシュの衝突が起きる確率を低下させるハッシュ関数を決定できる。これにより、辞書バッファ21の検索精度を向上できる。したがって、例えば、辞書バッファ21を用いて、入力データを辞書アドレスと一致長の組に変換することを利用して、入力データを圧縮する場合に、圧縮効率が向上する。
【0178】
なお、データ判断部20は、入力データ情報だけでなく、入力データの内容に関する判断結果も用いて、ハッシュ関数情報を生成してもよい。データ判断部20が入力データの内容を判断するための動作については、第1実施形態で前述した通りである。
【0179】
第2実施形態に係る圧縮装置15の検索部151において実行される検索処理の手順は、
図14のフローチャートを参照して前述した検索処理において、ステップS101のハッシュ関数情報生成処理として、
図18のフローチャートに示す手順が実行されればよい。
【0180】
図18は、圧縮装置15の検索部151において実行されるハッシュ関数情報生成処理の手順の例を示すフローチャートである。
【0181】
まず、検索部151は入力データ情報を取得する(ステップS31)。入力データ情報は、入力データXと共に検索部151に入力されてもよいし、ユーザによる操作で入力されてもよい。
【0182】
検索部151は入力データ情報を用いて、ハッシュ関数情報を生成する(ステップS32)。例えば、入力データ情報が、入力データXがテキストデータであることを示す場合、検索部151は、バイト単位のデータ部の最上位ビットを用いないことを示すハッシュ関数情報を生成する。また例えば、入力データ情報が、入力データXに含まれるバイト単位のデータ部の第iビットが常に0であることを示す場合、検索部151は、バイト単位のデータ部の第iビットを用いないことを示すハッシュ関数情報を生成する。
【0183】
以上の
図18のハッシュ関数情報生成処理により、検索部151は入力データ情報に基づくハッシュ関数情報を生成できる。検索部151(より詳しくはハッシュ計算部22)は、生成したハッシュ関数情報を用いて、例えば、データ部の特定のビットを用いないハッシュ関数を決定できる。
【0184】
(第3実施形態)
第1実施形態では、検索部151は入力データの内容に応じたハッシュ関数情報を生成する。これに対して、第3実施形態では、検索部151は入力データを変換し、変換により得られたデータ(変換データ)の内容に応じたハッシュ関数情報を生成する。
【0185】
第3実施形態に係る圧縮装置15の構成は第1実施形態の圧縮装置15と同様であり、第3実施形態と第1実施形態とでは、検索部151に入力データを変換するための構成を加え、入力データではなく変換データを処理する点のみが異なる。以下、第1実施形態と異なる点を主に説明する。
【0186】
図19は、第3実施形態の圧縮装置15に設けられる検索部151の構成例を示す。検索部151は、データ判断部20、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、一致比較器24、およびデータ変換部25を備える。
【0187】
データ変換部25は入力データを受け付ける。データ変換部25は入力データを変換する。
【0188】
具体的には、データ変換部25は、入力データを構成するバイト単位のデータ部を、先頭から順にインデックス番号に変換する。変換すべきバイト単位のデータ部が、データ変換部25に初めて入力された値である場合、データ変換部25は、その値にインデックス番号を割り当てる。つまり、データ変換部25は、変換すべきバイト単位のデータ部として、1つの値が最初に出現したことに応じて、その値にインデックス番号を割り当てる。インデックス番号は、0から順に割り当てられ、初めて入力される値が出現する毎に、1ずつ増加する。したがって、より早く出現した値には、より小さいインデックス番号が割り当てられる。
【0189】
データ変換部25による入力データの変換を、入力データの具体例を用いて説明する。ここでは、入力データが、先頭から順に、“10,20,44,38,88,10,88,90,2,5,100,...”である場合について例示する。
【0190】
まず、データ変換部25は、値“10”にインデックス番号“0”を割り当てる。データ変換部25は、値“20”にインデックス番号“1”を割り当てる。データ変換部25は、値“44”にインデックス番号“2”を割り当てる。データ変換部25は、値“38”にインデックス番号“3”を割り当てる。データ変換部25は、後続する値についても、その値が最初に出現した際に、同様にしてインデックス番号を割り当てる。
【0191】
データ変換部25は、入力データの値に対するインデックス番号の割り当てに従って、入力データの値をインデックス番号に変換する。具体的には、データ変換部25は、値“10”をインデックス番号0”に変換する。データ変換部25は、値“20”をインデックス番号“1”に変換する。データ変換部25は、値“44”をインデックス番号“2”に変換する。データ変換部25は、値“38”をインデックス番号“3”に変換する。データ変換部25は、同様にして、後続する値をインデックス番号に変換する。
【0192】
したがって、データ変換部25は、入力データ“10,20,44,38,88,10,88,90,2,5,100,...”を、“0,1,2,3,4,0,4,5,6,7,8,...”に変換する。データ変換部25は、変換により得られたデータをデータ判断部20に出力する。変換により得られたデータを、変換データとも称する。
【0193】
さらに、データ変換部25は、入力データの値に対するインデックス番号の割り当てに従って、入力データの値とインデックス番号との対応関係を示すデータ変換表を生成する。
【0194】
図20はデータ変換表の一構成例を示す。
図20に示すデータ変換表は、データ変換部25が、入力データ“10,20,44,38,88,10,88,90,2,5,100,...”が入力された場合に生成したデータ変換表である。
【0195】
データ変換表は、例えば、入力データを辞書式符号化した符号化データを復号する場合に用いられる。データ変換部25は、生成したデータ変換表を、圧縮データと共に出力する。そして、コントローラ4(より詳しくはCPU12)は、データ変換表と圧縮データとを、NAND I/F13を介してNAND型フラッシュメモリ5に書き込む。データ変換表は、例えば、圧縮データの前方に配置される。つまり、コントローラ4は、データ変換表を圧縮データの前方に追加して、NAND型フラッシュメモリ5に書き込む。なお、データ変換部25は、符号化データを復号する外部の装置(例えば伸張装置16)や処理回路に、データ変換表を送出してもよい。
【0196】
データ判断部20、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、および一致比較器24の動作については、入力データが変換データに置き換えられることを除いて、第1実施形態のデータ判断部20、辞書バッファ21、ハッシュ計算部22、ハッシュテーブル23、および一致比較器24の動作と同様である。
【0197】
図21は、データ変換によって特定のビットを用いないハッシュ関数が決定される例を示す。
図21に示す例では、データ変換部25に入力データとして入力される値が、8’b1010_1010と8’b0101_0101の2つの値のみである場合を想定する。
【0198】
これら2つの値を含む入力データを解析した場合、第0ビット(最下位ビット)から第7ビット(最上位ビット)までの8つのビットのいずれにも、0と1の両方の値が出現する。そのため、データ判断部20は、入力データを構成するバイト単位のデータ部において、常に0であるビットを、あるいは常に1であるビットを、検知できない。
【0199】
そこで、データ変換部25は、例えば、8’b1010_1010をインデックス番号“0”(=8’b0000_0000)に変換し、8’b0101_0101をインデックス番号“1”(=8’b0000_0001)に変換する。つまり、データ変換部25は、入力データを、“0”と“1”で構成されるデータに変換する。
【0200】
変換データに含まれるバイト単位のデータ部は、最下位ビット(第0ビット)以外の、第1ビットから第7ビットまでの7つのビットが全て0になる。これにより、データ判断部20は、変換データを構成するバイト単位のデータ部において、常に0である第1ビットから第7ビットを検知できる。そして、データ判断部20は、例えば、データ部の第1ビットから第7ビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成する。ハッシュ計算部22は、ハッシュ関数情報に従って、データ部の第1ビットから第7ビットを用いないハッシュ関数で、変換データ(より詳しくは変換データの少なくとも一部)のハッシュ値を計算する。
【0201】
ここで、より実用的な例として、入力データを構成するバイト単位の各データ部が、0から3ずつ増加させたいずれかの値である場合を想定する。つまり、バイト単位の各データ部は、例えば、0,3,6,9,...,252のいずれかの値である。この場合、入力される値の種類は、86種類以下となる。
【0202】
入力される値の種類が86種類以下であるので、データ変換部25は、入力データを構成するバイト単位の各データ部の値を、0から85までのいずれかのインデックス番号に変換できる。つまり、データ変換部25は、入力データを構成するバイト単位の各データ部の値を、最上位ビットが常に0になるインデックス番号に変換できる。したがって、データ判断部20は、例えば、データ部の最上位ビットを用いないハッシュ関数を決定するためのハッシュ関数情報を生成できる。ハッシュ計算部22は、ハッシュ関数情報に従って、データ部の最上位ビットを用いないハッシュ関数で、変換データのハッシュ値を計算する。これにより、ハッシュの衝突が起きる確率を低減できる。
【0203】
また、入力される値の種類が129種類以上である場合、例えば、データ変換部25は、特定の量の入力データを、あるいは全ての入力データをバッファする。そして、データ変換部25は、出現頻度が低い値に、129以上のインデックス番号を割り当てる。これにより、変換データに含まれる値(データ部)の最上位ビットが1である確率を低くすることができる。したがって、データ変換部25は、入力データを、最上位ビットが1である確率が低いインデックス番号で構成されるデータに変換できる。
【0204】
そして、データ判断部20およびハッシュ計算部22は、最上位ビットを用いないハッシュ関数で、変換データのハッシュ値を計算する。あるいは、データ判断部20およびハッシュ計算部22は、最上位ビットを用いる回数が、最上位ビット以外の各ビットを用いる回数よりも少ないハッシュ関数で、変換データのハッシュ値を計算してもよい。これにより、ハッシュの衝突が起きる確率を低減できる。
【0205】
図19から
図21に示した構成により、検索部151は、入力される値の種類が少ない場合に、入力データを変換することで、ハッシュの衝突が起きる確率を低下させる。これにより、辞書バッファ21の検索精度を向上できる。したがって、例えば、辞書バッファ21を用いて、入力データを辞書アドレスと一致長の組に変換することを利用して、入力データを圧縮する場合に、圧縮効率が向上する。
【0206】
図22は、圧縮装置15の検索部151において実行される検索処理の手順の例を示すフローチャートである。検索処理は、入力データXを変換した変換データYを取得し、辞書バッファ21を検索して、変換データYに対する辞書式符号化を行うための処理である。
【0207】
まず、検索部151は、入力データXを変換した変換データYを取得する(ステップS401)。検索部151は、例えば、入力データXをインデックスに変換することによって、変換データYを取得する。
【0208】
検索部151は、変換データYに対するハッシュ関数情報生成処理を実行する(ステップS402)。ステップS402のハッシュ関数情報生成処理の具体的な手順は、
図15のフローチャートを参照して前述したハッシュ関数情報生成処理において、入力データXを変換データYに置き換えればよい。
【0209】
また、以降のステップS403からステップS413までの手順は、
図14のフローチャートを参照して前述した検索処理のステップS102からステップS112までの手順において、入力データXを変換データYに置き換え、入力データXのハッシュ値H(X)を変換データYのハッシュ値H(Y)に置き換えればよい。
【0210】
ステップS403からステップS413までの手順で変換データYの辞書式符号化が完了した後、検索部151は後続する入力データXがあるか否かを判定する(ステップS414)。後続する入力データXがある場合(ステップS414のYES)、検索部151は入力データXを変換した変換データYを取得して(ステップS415)、ステップS404に戻る。つまり、検索部151は、後続する入力データXを変換した変換データYの辞書式符号化のための処理を行う。この変換データYのハッシュ値の計算には、ステップS403で既に決定されたハッシュ関数Hが用いられる。なお、検索部151は、ステップS401およびステップS415において、特定の単位毎に入力データXを変換データYに変換する代わりに、ステップS401において、ファイルのような入力データ全体を変換した変換データを取得してもよい。
【0211】
一方、後続する入力データXがない場合(ステップS414のNO)、検索部151は検索処理を終了する。
【0212】
以上の
図22の検索処理により、検索部151は、入力データXを変換した変換データYを取得した後、辞書バッファ21を検索して、変換データYに対する辞書式符号化を行うことができる。具体的には、変換データYと少なくとも一部が一致するデータが辞書バッファ21に記憶されている場合、検索部151は変換データYを辞書アドレス(第1アドレス)と一致長との組に変換できる。変換データYと少なくとも一部が一致するデータが辞書バッファ21に記憶されていない場合、検索部151は変換データYをそのまま出力する。
【0213】
また、検索部151は、変換データYを辞書バッファ21に新たに登録できる。すなわち、検索部151は、変換データYを辞書バッファ21に格納した後、ハッシュ値H(Y)を利用して辞書バッファ21に記憶された変換データYにアクセスできるように、ハッシュテーブル23に、変換データYが記憶された辞書アドレス(第2アドレス)を格納する。これにより、検索部151は、以降の入力データを変換した変換データの辞書式符号化に、辞書バッファ21に登録された変換データYを利用できる。
【0214】
以上説明したように、第1乃至第3実施形態によれば、辞書内のデータの検索精度を向上できる。ハッシュテーブル23は、複数のハッシュ値にそれぞれ関連付けられた複数のアドレスを記憶する。辞書バッファ21は、これら複数のアドレスでそれぞれ特定される複数の記憶領域であって、複数のデータをそれぞれ記憶する複数の記憶領域を含む。データ判断部20およびハッシュ計算部22は、第1データの少なくとも一部に基づいて、第1データに対して用いるべき第1ハッシュ関数を決定し、第1ハッシュ関数と、第1データに含まれる第2データの少なくとも一部とを用いて、第1ハッシュ値を計算する。一致比較器24は、ハッシュテーブル23に記憶された、第1ハッシュ値に関連付けられた第1アドレス(辞書リードアドレス)を用いて、辞書バッファ21内の第1アドレスで特定される記憶領域から第3データを取得し、第2データと第3データとを比較する。
【0215】
データ判断部20およびハッシュ計算部22は、第1データに基づいて第1ハッシュ関数を決定するので、ハッシュの衝突を発生させる確率が低いハッシュ関数を用いて、第2データのハッシュ値を計算できる。これにより、一致比較器24が、第2データと比較される対象として適切な第3データを辞書バッファ21から取得できる可能性が高まる。つまり、辞書バッファ21内のデータの検索精度を向上できる。したがって、例えば、辞書バッファ21を用いて、入力データを辞書アドレスと一致長の組に変換することを利用して、入力データを圧縮する場合に、圧縮効率が向上する。
【0216】
また、第1乃至第3実施形態に記載された様々な機能の各々は、回路(処理回路)によって実現されてもよい。処理回路の例には、中央処理装置(CPU)のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム(命令群)を実行することによって、記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。これら実施形態に記載されたCPU以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
【0217】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0218】
1…情報処理システム、2…ホスト、3…メモリシステム、4…コントローラ、5…NAND型フラッシュメモリ、6…DRAM、10…バス、11…ホストI/F、12…CPU、13…NAND I/F、14…DRAM I/F、15…圧縮装置、151…検索部、152…エントロピー符号化部、153…パック処理部、20…データ判断部、21…辞書バッファ、22…ハッシュ計算部、23…ハッシュテーブル、24…一致比較器。