跳至內容

Adler鋪三十二

出自Taiwan Tongues 台語維基
於 2025年8月24日 (日) 05:55 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Adler 鋪三十二是一種校驗演算法,由馬克 ・ 阿德勒佇一九九五年發明,是嘿 Fletcher 校驗的一種改進。佮長度的迴箍傷長的校驗相比,伊這有可靠性來換取速度(閣較傾向後者)。 Adler 鋪三十二比 Fletcher 鋪十六更加可靠,比 Fletcher 鋪三十二可靠性小差。

歷史

Adler 學三十二校驗佮是廣泛使用的 zlib 壓縮庫的一部份,因為兩个攏是由馬克 ・ 阿德勒開發的。佇咧 rsync 工具內底使用矣 Adler 抹三十二的「踅踅雜鬥」版本。

演算法

Adler 鋪三十二校驗佮是通過計算兩个十六位元的校驗佮 _ A _ 和 _ B _,並且共𪜶的位連做一个三十二位元整數來得著的。_ A _ 是流中所有一个元組的總和加一,而且 _ B _ 是每一步驟中 _ A _ 的各个值的總和。 佇咧 Adler 抹三十二執行開始的時,_ A _ 予人初初化做一,_ B _ 為零。以模六馮五千五百二十一(小於兩百十六的上大質數)進行求和。位元組以網路順序儲存(位元組序), _ B _ 占領上懸的兩个位元組。

該函式會當表示為

` ` ` _ A _=一 + _ D _ 一 + _ D _ 二 + . . . + _ D _ n ( mod 六嬸五千五百二十一 )

_ B _=( 一 + _ D _ 一 ) + ( 一 + _ D _ 一 + _ D _ 二 ) + . . . + ( 一 + _ D _ 一 + _ D _ 二 + . . . + _ D _ n ) ( mod 六嬸五千五百二十一 ) =_ n _ × _ D _ 一 + ( _ n _ − 一 ) × _ D _ 二 + ( _ n _ − 二 ) × _ D _ 三 + . . . + _ D _ n + _ n _ ( mod 六嬸五千五百二十一 )

_ Adler 鋪三十二 _ ( _ D _ )=_ B _ × 六嬸五千五百三十六 + _ A _ ` ` `

其中 _ D _ 是欲計算校驗佮的位元組串,_ n _ 是 _ D _ 的長度。

範例

ASCII 字捾「` Wikipedia `」的 Adler 鋪三十二校驗佮計算如下:

` ` ` A=九百二十=零 x 三百九十八 ( 十六進位 ) B=四千五百八十二=零 x 十一 E 六輸出=零 x 十一 E 六 < < 十六 + 零 x 三百九十八=零 x 十一 E 六桱空三百九十八 ` ` `

佇這个例中,取模運算無效果,因為無一个值達到六石五千五百二十一。

佮 Fletcher 校驗佮的較

兩種演算法之間的第一个區別,是 Adler 鋪三十二和是以一个質數為模數計算的,而且 Fletcher 佮是以二十四孵一、二十八孵一抑是兩百十六孵一為模(攏著愛看所使用的位數)為模數算的,𪜶攏是複合數。使用質數予得 Adler 抹三十二會用得揣著 Fletcher 無法度檢測著的某一寡位元組合中的差異。

第二个區別,嘛是對演算法的速度影響上大的區別,是 Adler 佮八位元的位元組頂懸算的,毋是十六位元的字上,迵天天次數增加一倍。這愛對十六位元字對齊資料,Adler 鋪三十二校驗佮開的時間是 Fletcher 校驗佮的一人五倍到二倍。對位元組對齊的資料,Adler 鋪三十二比正確實現的 Fletcher 的校驗佮(比如講,HDF 中的實現)要緊。

實現範例

佇咧 C 語言內底,一个低效但是直接的實現方式是:

請參閱 zlib 原始碼,了解閣較有效的實現,伊需要對逐个位元組來進行一擺的取數和兩擺的加法,模數運算延後,並每隔幾千个位元組計算兩改的數,這種技術上早是佇一九八八年予人發現用於 Fletcher 校驗。` js-adler 三十二 ` 嘛提供類似的最佳化,增加一个技巧,即推遲計算六馮五千五百三十六馮六馮五千五百二十一當著的「十五」,按呢模數運算就會變閣較緊:會當證明 ` ( ( a > > 十六 ) * 十五 + ( a & 六嬸五千五百三十五 ) )   % 六嬸五千五百二十一 ` 比較是簡單的積累。

優點佮缺點

  • 佮標準 CRC 炕三十二仝款,Adler 鋪三十二校驗佮真容易假造,因此佇咧防止故意修改方面是無安全的。
  • 佇真濟平台頂,伊攏比 CRC 鋪三十二閣較緊。
  • Adler 枋三十二對於干焦幾百个位元組的簡訊方面有一个弱點,因為這類訊息的校驗佮對三十二个會當用位的崁率是足低的。

較弱點

對簡訊來講,Adler 抹三十二是足弱的,因為總和 _ A _ 袂曉轉踅(英語:Wrap,即整數溢了後的處理)。 一百二十八个元組訊息的上大是三分之一二千六百四十,低於取模操作所使用的值六增五千五百二十一,意味注文大約有一半的輸出空間無使用,並且使用部份內底的分布嘛是無齊勻。延伸的解說會當佇 RFC  三千三百空九中揣著,伊規定流控制傳輸協定 SCTP 使用 CRC 三十二 C 毋是 Adler 鋪三十二。對較細的增量更改,Adler 炕三十二嘛予人證明變化足弱的,並且對一个共同的字首佮連紲的數字生的字串嘛足弱的(譬如講由典型碼產生器自動生成的標籤名)。

參見

  • 雜鬥函式列表

註跤

外部連結

  • RFC  一千九百五十–規範,包含範例 C 代碼
  • ZLib–佇咧 adler 三十二 . c 中實現矣 Adler 抹三十二演算法
  • Chrome–佇咧 adler 三十二 \ _ simd . c 中使用 SIMD 實現的 Adler 抹三十二演算法
  • RFC  三千三百空九–有關係簡訊弱點佮 SCTP 相關改做的資訊