Guest User

Untitled

a guest
Mar 22nd, 2019
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.89 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "math/rand"
  6.     "time"
  7.     "unsafe"
  8. )
  9.  
  10. var (
  11.     source   []byte
  12.     tbl      [0xffffff]uint32
  13.     b64alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  14. )
  15.  
  16. func base64b(source []byte) {
  17.     print("Run bitwise ")
  18.     result := make([]byte, len(source)*4/3)
  19.     start := time.Now().UnixNano()
  20.     j := 0
  21.     for i := 0; i < len(source); i += 3 {
  22.         block := (uint32(source[i]) << 16) | (uint32(source[i+1]) << 8) | uint32(source[i+2])
  23.  
  24.         result[j+0] = b64alpha[block>>18&0x3f]
  25.         result[j+1] = b64alpha[block>>12&0x3f]
  26.         result[j+2] = b64alpha[block>>6&0x3f]
  27.         result[j+3] = b64alpha[block&0x3f]
  28.         j += 4
  29.     }
  30.     fmt.Printf("%f s\n", float64(time.Now().UnixNano()-start)/1e9)
  31.     fmt.Printf("Base64: %s...\n", string(result[:40]))
  32. }
  33.  
  34. func base64t(source []byte) {
  35.     print("Run tabular ")
  36.     result := make([]byte, len(source)*4/3)
  37.     start := time.Now().UnixNano()
  38.     j := 0
  39.     for i := 0; i < len(source); i += 3 {
  40.         block := (*(*uint32)(unsafe.Pointer(&source[i]))) & 0xffffff
  41.         *(*uint32)(unsafe.Pointer(&result[j])) = tbl[block]
  42.         j += 4
  43.     }
  44.     fmt.Printf("%f s\n", float64(time.Now().UnixNano()-start)/1e9)
  45.     fmt.Printf("Base64: %s...\n", string(result[:40]))
  46. }
  47.  
  48. func main() {
  49.     println("Prepare table")
  50.     for i := 0; i < 0xffffff; i++ {
  51.         block := (i & 0xff << 16) | (i & 0xff00) | (i >> 16)
  52.  
  53.         tbl[i] = uint32(b64alpha[block>>18&0x3f]) |
  54.             uint32(b64alpha[block>>12&0x3f])<<8 |
  55.             uint32(b64alpha[block>>6&0x3f])<<16 |
  56.             uint32(b64alpha[block&0x3f])<<24
  57.     }
  58.  
  59.     source = make([]byte, 3*10*1024*1024) // must be multiple of three
  60.  
  61.     rand.Read(source)
  62.     fmt.Printf("\nRandom source data: %#v...\n", source[:10])
  63.     base64b(source)
  64.     base64t(source)
  65.  
  66.     alpha := "abcdefghijklmnopqrstuvwxyz0123456789 {}\":"
  67.     for i := range source {
  68.         source[i] = alpha[rand.Intn(len(alpha))]
  69.     }
  70.     fmt.Printf("\nText source data: %s...\n", source[:30])
  71.     base64b(source)
  72.     base64t(source)
  73. }
Add Comment
Please, Sign In to add comment