CRC32
今天在看rocketmq源码时,看到CRC32,就记录下来以供学习。主要用途:
在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(Cyclic Redundancy Check/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。
1if (!checksum(ctx, request, requestHeader)) { 2 response.setCode(ResponseCode.SYSTEM_ERROR); 3 response.setRemark("crc32 not match"); 4 return response; 5} 6 7 8 9 10private boolean checksum(ChannelHandlerContext ctx, RemotingCommand request, 11 RegisterBrokerRequestHeader requestHeader) { 12 if (requestHeader.getBodyCrc32() != 0) { 13 final int crc32 = UtilAll.crc32(request.getBody()); 14 if (crc32 != requestHeader.getBodyCrc32()) { 15 log.warn(String.format("receive registerBroker request,crc32 not match,from %s", 16 RemotingHelper.parseChannelRemoteAddr(ctx.channel()))); 17 return false; 18 } 19 } 20 return true; 21 } 22 23 24public static int crc32(byte[] array) { 25 if (array != null) { 26 return crc32(array, 0, array.length); 27 } 28 29 return 0; 30 } 31 32 33public static int crc32(byte[] array, int offset, int length) { 34 CRC32 crc32 = new CRC32(); 35 crc32.update(array, offset, length); 36 return (int) (crc32.getValue() & 0x7FFFFFFF); 37 }