何时使用CRC进行错误检测而不是更现代的散列函数(如MD5或SHA1)?前者在嵌入式硬件上更容易实现吗?
创建哈希函数的最快方法是什么,用于检查两个文件是否相等?
安全性不是很重要.
编辑:我通过网络连接发送文件,并确保双方的文件相同
我正在构建一个系统,它需要能够找到是否已更新blob字节.我认为我应该计算它的校验和,存储它并稍后计算相同的校验和,以查看博客是否已更新,而不是存储整个blob(它们可以高达5MB).
目标是最小化以下(按此顺序):
我们的系统碰撞不超过1/1,000,000是可以接受的.问题不在于安全性,而在于更新/错误检测,因此罕见的冲突是可以的.(这就是为什么我把它放在最小化的东西中).
另外,我们不能自己修改文本的blob.
当然,md5
,crc
或sha1
浮现在脑海中,如果我想要一个快速的解决方案,我去了.然而,不仅仅是一个快速的解决方案,我正在寻找可以比较不同方法以及利弊的东西.
我正在开发一个库,通过RS232或RS485连接提供简单可靠的通信.此代码的一部分涉及对数据使用CRC16校验和来检测线路噪声的损坏.我已经创建了一个计算CRC16校验和的函数,但它似乎没有输出正确的值.
我写的相关代码如下(也可以在这里找到).
#include <stdint.h>
#define CRC16 0x8005
uint16_t gen_crc16(const uint8_t *data, uint16_t size)
{
uint16_t out = 0;
int bits_read = 0, bit_flag;
/* Sanity check: */
if(data == NULL)
return 0;
while(size > 0)
{
bit_flag = out >> 15;
/* Get next bit: */
out <<= 1;
out |= (*data >> (7 - bits_read)) & 1;
/* Increment bit counter: */
bits_read++;
if(bits_read > 7)
{
bits_read = 0;
data++;
size--;
}
/* Cycle check: */ …
Run Code Online (Sandbox Code Playgroud) 我想使用boost :: crc,以便它的工作方式与PHP的crc32()函数完全相同.我尝试阅读可怕的文档和许多令人头疼的事情后来我没有取得任何进展.
显然我必须做以下事情:
int GetCrc32(const string& my_string) {
return crc_32 = boost::crc<bits, TruncPoly, InitRem, FinalXor,
ReflectIn, ReflectRem>(my_string.c_str(), my_string.length());
}
Run Code Online (Sandbox Code Playgroud)
bits
应该是32 ..其他事情是一个谜.一点帮助?;)
我在数据库中有一个10个字符的字符串键字段.我已经使用CRC32来散列这个字段,但我担心重复.在这种情况下,有人能告诉我碰撞的可能性吗?
ps我的字符串字段在数据库中是唯一的.如果字符串字段的数量是100万,那么碰撞概率是多少?
我见过8位,16位和32位CRC.
在什么时候我需要跳到更宽的CRC?
我的直觉反应是它基于数据长度:
编辑:查看有关CRC和洛特答案的维基百科页面,这里有'我们所拥有的:
<64字节:8位CRC
<16K字节:16位CRC
<512M字节:32位CRC
我想在Ruby on rails上计算'输入字段值'的32位CRC值.需要示例代码,请帮助我任何人.
我有一个旧的,不再制造的带有串口的电子设备.我正在尝试对此设备中使用的数据包CRC /校验和/散列进行逆向工程.
任何有敏锐眼光,有敏锐数学技能的人都可以破解这个东西?
这是我到目前为止所知道的......
验证我的数据包样本观察到上述网络链接中概述的"叠加原则".这表明它们具有数学XOR关系.
开始感觉很好......但之后又难过了.无法确定CRC-16多项式.这些数据包哈希很可能不与CRC相关,而是一些家庭酿造方案.
通过Ross N. Williams阅读"CRC错误检测算法的无痛指南"
不幸的是,我无法访问任何设备源/二进制代码
还运行测试以查看是否使用了其他哈希,例如Fletcher的校验和
以下是我的数据包的各种样本.
0x47366B2EE00000000000751CEB5F3469543B585E2D
0x47366B2ED00000000000751CEB5F3469543B582A2C
0x47366B2EC80000000000751CEB5F3469543B580B2B
0x47366B2EC40000000000751CEB5F3469543B58BB2A
0x47366B2EC20040000000751CEB5F3469543B58DFE7
0x47366B2EC10000000000751CEB5F3469543B58A328
0x47366B2EC08000000000751CEB5F3469543B584127
0x47366B2EC04000000000751CEB5F3469543B588126
0x47366B2EC02000000000751CEB5F3469543B580525
0x47366B2EC01000000000751CEB5F3469543B580124
请注意以下有关这些数据包的信息......
(0X47)............................................... ......................(0x2D)
我不知道我的系统是大端还是小端,但是确定的字节是LSB优先的
请参阅数据包的0x47366B2E部分之后的数据字节.
只有模式我看到出现的是每个数据包上的最后一个字节递减一(2D,2C,...).(除了第5个数据包,我必须更改2位)
任何帮助表示赞赏!
我想计算文件的CRC并获得如下的输出:E45A12AC
.这是我的代码:
#!/usr/bin/env python
import os, sys
import zlib
def crc(fileName):
fd = open(fileName,"rb")
content = fd.readlines()
fd.close()
for eachLine in content:
zlib.crc32(eachLine)
for eachFile in sys.argv[1:]:
crc(eachFile)
Run Code Online (Sandbox Code Playgroud)
这计算每行的CRC,但其输出(例如-1767935985
)不是我想要的.
Hashlib以我想要的方式工作,但它计算md5:
import hashlib
m = hashlib.md5()
for line in open('data.txt', 'rb'):
m.update(line)
print m.hexdigest()
Run Code Online (Sandbox Code Playgroud)
是否可以使用类似的东西zlib.crc32
?