PasteRack.org
Paste # 58907
2018-04-19 16:18:45

Fork as a new paste.

Paste viewed 408 times.


Embed:

  1. #lang racket
  2.  
  3. (require racket/require
  4.          (only-in racket/fixnum fxvector)
  5.          (filtered-in (λ (name)
  6.                         (regexp-replace #rx"unsafe-" name ""))
  7.                       racket/unsafe/ops))
  8.  
  9. (module+ test (require rackunit))
  10.  
  11. (define table (fxvector #x00000000 #xF26B8303 #xE13B70F7 #x1350F3F4
  12.                         #xC79A971F #x35F1141C #x26A1E7E8 #xD4CA64EB
  13.                         #x8AD958CF #x78B2DBCC #x6BE22838 #x9989AB3B
  14.                         #x4D43CFD0 #xBF284CD3 #xAC78BF27 #x5E133C24
  15.                         #x105EC76F #xE235446C #xF165B798 #x030E349B
  16.                         #xD7C45070 #x25AFD373 #x36FF2087 #xC494A384
  17.                         #x9A879FA0 #x68EC1CA3 #x7BBCEF57 #x89D76C54
  18.                         #x5D1D08BF #xAF768BBC #xBC267848 #x4E4DFB4B
  19.                         #x20BD8EDE #xD2D60DDD #xC186FE29 #x33ED7D2A
  20.                         #xE72719C1 #x154C9AC2 #x061C6936 #xF477EA35
  21.                         #xAA64D611 #x580F5512 #x4B5FA6E6 #xB93425E5
  22.                         #x6DFE410E #x9F95C20D #x8CC531F9 #x7EAEB2FA
  23.                         #x30E349B1 #xC288CAB2 #xD1D83946 #x23B3BA45
  24.                         #xF779DEAE #x05125DAD #x1642AE59 #xE4292D5A
  25.                         #xBA3A117E #x4851927D #x5B016189 #xA96AE28A
  26.                         #x7DA08661 #x8FCB0562 #x9C9BF696 #x6EF07595
  27.                         #x417B1DBC #xB3109EBF #xA0406D4B #x522BEE48
  28.                         #x86E18AA3 #x748A09A0 #x67DAFA54 #x95B17957
  29.                         #xCBA24573 #x39C9C670 #x2A993584 #xD8F2B687
  30.                         #x0C38D26C #xFE53516F #xED03A29B #x1F682198
  31.                         #x5125DAD3 #xA34E59D0 #xB01EAA24 #x42752927
  32.                         #x96BF4DCC #x64D4CECF #x77843D3B #x85EFBE38
  33.                         #xDBFC821C #x2997011F #x3AC7F2EB #xC8AC71E8
  34.                         #x1C661503 #xEE0D9600 #xFD5D65F4 #x0F36E6F7
  35.                         #x61C69362 #x93AD1061 #x80FDE395 #x72966096
  36.                         #xA65C047D #x5437877E #x4767748A #xB50CF789
  37.                         #xEB1FCBAD #x197448AE #x0A24BB5A #xF84F3859
  38.                         #x2C855CB2 #xDEEEDFB1 #xCDBE2C45 #x3FD5AF46
  39.                         #x7198540D #x83F3D70E #x90A324FA #x62C8A7F9
  40.                         #xB602C312 #x44694011 #x5739B3E5 #xA55230E6
  41.                         #xFB410CC2 #x092A8FC1 #x1A7A7C35 #xE811FF36
  42.                         #x3CDB9BDD #xCEB018DE #xDDE0EB2A #x2F8B6829
  43.                         #x82F63B78 #x709DB87B #x63CD4B8F #x91A6C88C
  44.                         #x456CAC67 #xB7072F64 #xA457DC90 #x563C5F93
  45.                         #x082F63B7 #xFA44E0B4 #xE9141340 #x1B7F9043
  46.                         #xCFB5F4A8 #x3DDE77AB #x2E8E845F #xDCE5075C
  47.                         #x92A8FC17 #x60C37F14 #x73938CE0 #x81F80FE3
  48.                         #x55326B08 #xA759E80B #xB4091BFF #x466298FC
  49.                         #x1871A4D8 #xEA1A27DB #xF94AD42F #x0B21572C
  50.                         #xDFEB33C7 #x2D80B0C4 #x3ED04330 #xCCBBC033
  51.                         #xA24BB5A6 #x502036A5 #x4370C551 #xB11B4652
  52.                         #x65D122B9 #x97BAA1BA #x84EA524E #x7681D14D
  53.                         #x2892ED69 #xDAF96E6A #xC9A99D9E #x3BC21E9D
  54.                         #xEF087A76 #x1D63F975 #x0E330A81 #xFC588982
  55.                         #xB21572C9 #x407EF1CA #x532E023E #xA145813D
  56.                         #x758FE5D6 #x87E466D5 #x94B49521 #x66DF1622
  57.                         #x38CC2A06 #xCAA7A905 #xD9F75AF1 #x2B9CD9F2
  58.                         #xFF56BD19 #x0D3D3E1A #x1E6DCDEE #xEC064EED
  59.                         #xC38D26C4 #x31E6A5C7 #x22B65633 #xD0DDD530
  60.                         #x0417B1DB #xF67C32D8 #xE52CC12C #x1747422F
  61.                         #x49547E0B #xBB3FFD08 #xA86F0EFC #x5A048DFF
  62.                         #x8ECEE914 #x7CA56A17 #x6FF599E3 #x9D9E1AE0
  63.                         #xD3D3E1AB #x21B862A8 #x32E8915C #xC083125F
  64.                         #x144976B4 #xE622F5B7 #xF5720643 #x07198540
  65.                         #x590AB964 #xAB613A67 #xB831C993 #x4A5A4A90
  66.                         #x9E902E7B #x6CFBAD78 #x7FAB5E8C #x8DC0DD8F
  67.                         #xE330A81A #x115B2B19 #x020BD8ED #xF0605BEE
  68.                         #x24AA3F05 #xD6C1BC06 #xC5914FF2 #x37FACCF1
  69.                         #x69E9F0D5 #x9B8273D6 #x88D28022 #x7AB90321
  70.                         #xAE7367CA #x5C18E4C9 #x4F48173D #xBD23943E
  71.                         #xF36E6F75 #x0105EC76 #x12551F82 #xE03E9C81
  72.                         #x34F4F86A #xC69F7B69 #xD5CF889D #x27A40B9E
  73.                         #x79B737BA #x8BDCB4B9 #x988C474D #x6AE7C44E
  74.                         #xBE2DA0A5 #x4C4623A6 #x5F16D052 #xAD7D5351))
  75.  
  76. (define (crc32c-bytes bs)
  77.   (for/fold ([acc #xFFFFFFFF]
  78.              #:result (fxxor acc #xFFFFFFFF))
  79.             ([byte (in-bytes bs)])
  80.     (fxxor (fxrshift acc 8)
  81.            (fxvector-ref table (fxand (fxxor acc byte) #xFF)))))
  82.  
  83. (module+ test
  84.   (define-simple-check (test-crc32c-bytes cases)
  85.     (for ([case cases])
  86.       (check-equal? (crc32c-bytes (car case)) (cdr case))))
  87.  
  88.   (test-crc32c-bytes '((#"racket is a programming language" . #xF25CA55A)
  89.                        (#"                              " . #x80342806)
  90.                        (#"5bY4lZgsBE4iFE1" . #x5EC2F248)
  91.                        (#"" . #x0)
  92.                        (#"\0" . #x527D5351)
  93.                        (#"\0\1\2\3\4\5" . #x41098514))))
  94.  
  95. (define (crc32c-string s)
  96.   ;; todo
  97.   #f)

=>