github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/hash/crc32/crc32.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package crc32は32ビットの巡回冗長検査 (CRC-32) チェックサムを実装しています。
     6  // 詳細はhttps://en.wikipedia.org/wiki/Cyclic_redundancy_checkを参照してください。
     7  //
     8  // 多項式は、LSBファースト形式、または反転表現としても表されます。
     9  //
    10  // 詳細はhttps://en.wikipedia.org/wiki/Mathematics_of_cyclic_redundancy_checks#Reversed_representations_and_reciprocal_polynomialsを参照してください。
    11  package crc32
    12  
    13  import (
    14  	"github.com/shogo82148/std/hash"
    15  )
    16  
    17  // CRC-32のチェックサムのサイズ(バイト単位)。
    18  const Size = 4
    19  
    20  // 事前に定義された多項式。
    21  const (
    22  
    23  	// IEEEは、断然最も一般的なCRC-32多項式です。
    24  	// ethernet (IEEE 802.3)、v.42、fddi、gzip、zip、pngなどで使用されています。
    25  	IEEE = 0xedb88320
    26  
    27  	// キャスタニョーリの多項式、iSCSIで使用されています。
    28  	// IEEEよりも優れたエラー検出特性を持っています。
    29  	// https://dx.doi.org/10.1109/26.231911
    30  	Castagnoli = 0x82f63b78
    31  
    32  	// クープマンの多項式。
    33  	// IEEEよりもエラー検出性能が優れています。
    34  	// https://dx.doi.org/10.1109/DSN.2002.1028931
    35  	Koopman = 0xeb31d82e
    36  )
    37  
    38  // Tableは、効率的な処理のための多項式を表す256ワードのテーブルです。
    39  type Table [256]uint32
    40  
    41  // IEEETableは [IEEE] ポリノミアルのテーブルです。
    42  var IEEETable = simpleMakeTable(IEEE)
    43  
    44  // MakeTableは指定された多項式から構築された [Table] を返します。
    45  // この [Table] の内容は変更してはいけません。
    46  func MakeTable(poly uint32) *Table
    47  
    48  // Newは [Table] によって表現される多項式を使用してCRC-32チェックサムを計算する新しい [hash.Hash32] を作成します。
    49  // そのSumメソッドはビッグエンディアンのバイト順で値を配置します。
    50  // 返されるHash32は、内部状態のマーシャリングとアンマーシャリングを実装するため、 [encoding.BinaryMarshaler] と [encoding.BinaryUnmarshaler] も実装しています。
    51  func New(tab *Table) hash.Hash32
    52  
    53  // NewIEEEは、 [IEEE] 多項式を使用してCRC-32チェックサムを計算する新しい [hash.Hash32] を作成します。そのSumメソッドは、値をビッグエンディアンのバイト順でレイアウトします。
    54  // 返されるHash32は、 [encoding.BinaryMarshaler] および [encoding.BinaryUnmarshaler] も実装しており、ハッシュの内部状態をマーシャルおよびアンマーシャルすることができます。
    55  func NewIEEE() hash.Hash32
    56  
    57  // Updateはpのバイトをcrcに追加した結果を返します。
    58  func Update(crc uint32, tab *Table, p []byte) uint32
    59  
    60  // Checksumは [Table] で表されるポリノミアルを使用して、
    61  // dataのCRC-32チェックサムを返します。
    62  func Checksum(data []byte, tab *Table) uint32
    63  
    64  // ChecksumIEEEは、 [IEEE] 多項式を使用してデータのCRC-32チェックサムを返します。
    65  func ChecksumIEEE(data []byte) uint32