Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "math/rand"
- "time"
- "unsafe"
- )
- var (
- source []byte
- tbl [0xffffff]uint32
- b64alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
- )
- func base64b(source []byte) {
- print("Run bitwise ")
- result := make([]byte, len(source)*4/3)
- start := time.Now().UnixNano()
- j := 0
- for i := 0; i < len(source); i += 3 {
- block := (uint32(source[i]) << 16) | (uint32(source[i+1]) << 8) | uint32(source[i+2])
- result[j+0] = b64alpha[block>>18&0x3f]
- result[j+1] = b64alpha[block>>12&0x3f]
- result[j+2] = b64alpha[block>>6&0x3f]
- result[j+3] = b64alpha[block&0x3f]
- j += 4
- }
- fmt.Printf("%f s\n", float64(time.Now().UnixNano()-start)/1e9)
- fmt.Printf("Base64: %s...\n", string(result[:40]))
- }
- func base64t(source []byte) {
- print("Run tabular ")
- result := make([]byte, len(source)*4/3)
- start := time.Now().UnixNano()
- j := 0
- for i := 0; i < len(source); i += 3 {
- block := (*(*uint32)(unsafe.Pointer(&source[i]))) & 0xffffff
- *(*uint32)(unsafe.Pointer(&result[j])) = tbl[block]
- j += 4
- }
- fmt.Printf("%f s\n", float64(time.Now().UnixNano()-start)/1e9)
- fmt.Printf("Base64: %s...\n", string(result[:40]))
- }
- func main() {
- println("Prepare table")
- for i := 0; i < 0xffffff; i++ {
- block := (i & 0xff << 16) | (i & 0xff00) | (i >> 16)
- tbl[i] = uint32(b64alpha[block>>18&0x3f]) |
- uint32(b64alpha[block>>12&0x3f])<<8 |
- uint32(b64alpha[block>>6&0x3f])<<16 |
- uint32(b64alpha[block&0x3f])<<24
- }
- source = make([]byte, 3*10*1024*1024) // must be multiple of three
- rand.Read(source)
- fmt.Printf("\nRandom source data: %#v...\n", source[:10])
- base64b(source)
- base64t(source)
- alpha := "abcdefghijklmnopqrstuvwxyz0123456789 {}\":"
- for i := range source {
- source[i] = alpha[rand.Intn(len(alpha))]
- }
- fmt.Printf("\nText source data: %s...\n", source[:30])
- base64b(source)
- base64t(source)
- }
Add Comment
Please, Sign In to add comment