Go与Android的CRC32/Adler32算法使用

Packet在网络传输中必须要考虑万一数据损坏的情况,CRC32与Adler32都是最常用的算法。

Go与Android都内置好了这两种算法的实现,直接使用就好。

Go的调用方式如下:

// 校验算法(ADLER32/CRC32)例子
//author: Xiong Chuan Liang
//date: 2015-4-12

package main

import (
	"fmt"
	"hash/adler32"
	"hash/crc32"
)

var ADLER32 int = 0
var CRC32 int = 1

func main() {
	for _, v := range []string{"aaaaaaaaaa", "3333sdfsdffsdffsd", "234esrewr234324", `An Adler-32 checksum is obtained by calculating two 16-bit checksums A and B and concatenating their bits into a 32-bit integer. A is the sum of all bytes in the stream plus one, and B is the sum of the individual values of A from each step.
					At the beginning of an Adler-32 run, A is initialized to 1, B to 0. The sums are done modulo 65521 (the largest prime number smaller than 216). The bytes are stored in network order (big endian), B occupying the two most significant bytes.
					The function may be expressed as
					A = 1 + D1 + D2 + ... + Dn (mod 65521)
					 B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)
					   = n×D1 + (n?1)×D2 + (n?2)×D3 + ... + Dn + n (mod 65521)
					 Adler-32(D) = B × 65536 + A
					where D is the string of bytes for which the checksum is to be calculated, and n is the length of D.`} {
		calc(ADLER32, []byte(v))
		calc(CRC32, []byte(v))
	}
}

func calc(t int, b []byte) {
	var ret uint32
	if ADLER32 == t {
		ret = adler32.Checksum([]byte(b))
		fmt.Printf("ADLER32 %15d  : %s...  \n", ret, string(b[:5]))
	} else if CRC32 == t {
		ret = crc32.ChecksumIEEE([]byte(b))
		fmt.Printf("CRC32   %15d  : %s...  \n", ret, string(b[:5]))
	} else {
		return
	}
}

Android的就不举例了,相关包有详细说明:

CRC32:

http://wear.techbrood.com/reference/java/util/zip/CRC32.html

Adler32:

http://wear.techbrood.com/reference/java/util/zip/Adler32.html

两者效果都差不多,不过Adler32相对来说计算量会小些。

BLOG: http://blog.csdn.net/xcl168

时间: 2024-10-10 04:45:22

Go与Android的CRC32/Adler32算法使用的相关文章

计算机相关视频资料分享(C/C++、python、java/Android、linux、算法、数据库等)

相关视频学习资料(C/C++.python.java/Android.linux.算法.数据库等)仅用于学习交流,不要用于商业目的. 1.C/C++ 系列 链接:http://pan.baidu.com/s/1gdvKXIN 密码:lglp 2.python系列 链接:http://pan.baidu.com/s/1eQzl4aQ 密码:5931 3.linux 系列: 链接:http://pan.baidu.com/s/1hq7UiDu 密码:yk7r 4.java 和Android 系列 链

CRC32/CRC16算法C#中的实现

CRC32算法 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 6 namespace GetCRC32 7 { 8 class CRC32Cls 9 { 10 protected ulong[] Crc32Table; 11 //生成CRC32码表 12 public void GetCRC32Table() 13 { 14 ulong Crc; 15 C

android -------- DES加密解密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来.需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来. DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法

Android版数据结构与算法(八):二叉排序树

本文目录 前两篇文章我们学习了一些树的基本概念以及常用操作,本篇我们了解一下二叉树的一种特殊形式:二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 一.二叉排序树定义 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值 它的左,右子树也分别为二叉排序树 也就是说二叉排序树中左子树结点值均小于根结

android -------- Base64 加密解密算法

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数.在其他应

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

常见hash算法的原理

转自:http://blog.csdn.net/zxycode007/article/details/6999984 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的

几种常用hash算法及原理

计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单项函数.各种加密函 数都可以被认为是单向函数的逼近.Hash函数(或者成为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有另外的含义.实际中的Hash函数是指把一个大范围映射到一个小范围.把大

Hash算法的讲解

散列表,又叫哈希表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表.比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.70/100=0