我想用0xA001多项式计算字节数组的CRC-16校验和.但我真的不知道如何在Java中使用它,以及如何使用给定的多项式.它是某种特殊值(0xA001)吗?你能指点我一个可以为我计算校验和的图书馆,或者给我一些有用的资源吗?
在此先感谢,M.
MD5校验和广泛用于Http下载大文件的完整性检查.我的问题是,因为TCP本身提供了可靠的机制(即每个TCP包的校验和以确保其完整性).因此,简而言之,TCP是可靠的.Http基于TCP(因此Http也应该是可靠的),那么为什么我们需要另一种完整性检查机制(即MD5校验和)?
乔治,提前谢谢
我正在使用以下函数来计算文件的校验和:
public static void generateChecksums(String strInputFile, String strCSVFile) {
ArrayList<String[]> outputList = new ArrayList<String[]>();
try {
MessageDigest m = MessageDigest.getInstance("MD5");
File aFile = new File(strInputFile);
InputStream is = new FileInputStream(aFile);
System.out.println(Calendar.getInstance().getTime().toString() +
" Processing Checksum: " + strInputFile);
double dLength = aFile.length();
try {
is = new DigestInputStream(is, m);
// read stream to EOF as normal...
int nTmp;
double dCount = 0;
String returned_content="";
while ((nTmp = is.read()) != -1) {
dCount++;
if (dCount % 600000000 == 0) {
System.out.println(". …
Run Code Online (Sandbox Code Playgroud) 我有一个大小为4,9,16或25的数组(根据输入)并且数组中的数字相同但少一个(如果数组大小为9则数组中的最大元素将是8)数字从0开始, 我想做一些算法来为数组生成某种校验和,这样我就可以比较2个数组是否相等,而不是遍历整个数组并逐个检查每个元素.
我在哪里可以获得这类信息?我需要一些尽可能简单的东西.谢谢.
编辑:只是为了清楚我想要的东西:
- 数组中的所有数字都是不同的,因此[0,1,1,2]无效,因为存在重复的元素(1)
- 数字的位置很重要,所以[0,1,2,3]与[3,2,1,0]不一样
- 数组将包含数字0,因此这也应该被考虑在内.
编辑:
好吧,我试着在这里实现Fletcher的算法:http: //en.wikipedia.org/wiki/Fletcher%27s_checksum#Straightforward
int fletcher(int array[], int size){
int i;
int sum1=0;
int sum2=0;
for(i=0;i<size;i++){
sum1=(sum1+array[i])%255;
sum2=(sum2+sum1)%255;
}
return (sum2 << 8) | sum1;
}
Run Code Online (Sandbox Code Playgroud)
说实话,我不知道返回线做了什么但不幸的是,算法不起作用.对于数组[2,1,3,0]和[1,3,2,0],我得到相同的校验和.
EDIT2:
好的,这是另一个,Adler校验和 http://en.wikipedia.org/wiki/Adler-32#Example_implementation
#define MOD 65521;
unsigned long adler(int array[], int size){
int i;
unsigned long a=1;
unsigned long b=0;
for(i=0;i<size;i++){
a=(a+array[i])%MOD;
b=(b+a)%MOD;
}
return (b <<16) | a;
}
Run Code Online (Sandbox Code Playgroud)
这也行不通.数组[2,0,3,1]和[1,3,0,2]生成相同的校验和.我在这里失去了希望,任何想法?
我想制作一个MySQL数据库模式的哈希/签名(没有数据),以便对其进行校验和,以确保它不被其他人修改.
我怎样才能实现它?
我想在main中对当前堆栈进行校验和,以检查它是否在两点之间被改变.
例如:
int main(void) {
...
stack_checksum();
... process ...
if(stack_checksum() != ...)
altered.
}
Run Code Online (Sandbox Code Playgroud)
如何获取基本堆栈地址和堆栈顶部的当前地址?
编辑: 随着@MiroslavBajtoš帮助,步骤方法:
我有一个Hash
看起来像这样的数据结构():
{
foo: "Test string",
bar: [475934759, 5619827847]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个校验和,Hash
以检查将来是否相等.我尝试使用它的hash
方法Hash
,这导致了一个令人满意的好看的哈希,但事实证明,在Hash
重新启动解释器后,相同的将产生不同的哈希.
我真的希望能够从创建〜128位的校验和Hash
,String
或Array
实例.
这可能吗?
我需要从JavaScript对象创建校验和.
不幸的是,由于JavaScript的对象排序,似乎没有一种简单的方法可以实现这一点.例如,取这些对象:
var obj1 = {type:"cake",quantity:0}
, obj2 = {quantity:0,type:"cake"};
Run Code Online (Sandbox Code Playgroud)
我认为这些对象在数据上是相同的,并且希望它们的校验和是相同的.只要它们中的数据相同,我就真的不关心Object的顺序.
唉,JSON.stringify
两者实际上并不相同; 作为对象的校验和的唯一方法是通过它的String表示,并且JSON.stringify
-ed表示不相等,我的校验和将不相等!
我提出的一个解决方案是基于预定义的模式重新创建Object,如下所示:
var schema = ["type","quantity"];
function sortify(obj,schema){
var n={};
for(i in schema)
n[schema[i]]=obj[schema[i]];
return n
}
Run Code Online (Sandbox Code Playgroud)
运行JSON.stringify(sortify(obj1,schema))==JSON.stringify(sortify(obj2,schema))
将返回true
...但是以创建新对象并在数据周围移动为代价.
我的另一个解决方案是将JSON.stringify
方法替换为从预定义模式中选择键并对其值进行字符串化,然后将它们连接在一起的方法.功能如下:
function smarterStringify(obj,schema){
var s="";
for(i in schema)
s+=JSON.stringify(obj[schema[i]]);
return s
}
Run Code Online (Sandbox Code Playgroud)
忽略这个方法没有返回正确的JSON(它足够接近作为我正在尝试做的一个例子)这一事实,它比速度上的第一个提升了很多(至少在我的Chrome OS浏览器中,你可以在这里自己检查:http://jsperf.com/sort-then-json-stringify-vs-smarter-stringify),当然它使两个Object String表示相等!
但是,我只是想知道我是否遗漏了某些东西并且有一个内置的方法,这样的事情一直没有a)驱动JavaScript GC进入病态案例或b)做太多的字符串连接.我宁愿不做那些.
问题:
如何正确生成校验和,这是独立的,一致的,独立于浏览器?另外,我想将SHA256/MD5校验和字符串转换为64位.
如何在没有大量RAM要求的情况下正确读取文件以生成校验和?即我们如何在不影响RAM的情况下处理1 GB文件
例如,是否可以在不将文件加载到内存的情况下读取文件?(见答案)
这个项目似乎很有希望,但也无法实现.
我的目的是在X MB的块中逐步/递增地生成校验和.这可能有助于避免一次使用太多RAM.
以下是代码,它没有按预期工作:
let SIZE_CHECKSUM = 10 * Math.pow(1024, 2); // 10 MB; But can be 1 MB too
async function GetChecksum (file: File):
Promise<string>
{
let hashAlgorithm: CryptoJS.lib.IHasher<Object> = CryptoJS.algo.SHA256.create();
let totalChunks: number = Math.ceil(file.size / SIZE_CHECKSUM);
for (let chunkCount = 0, start = 0, end = 0; chunkCount < totalChunks; ++chunkCount)
{
end = Math.min(start + SIZE_CHECKSUM, file.size);
let resultChunk: string = await (new Response(file.slice(start, end)).text());
hashAlgorithm.update(resultChunk);
start …
Run Code Online (Sandbox Code Playgroud) _md5
当对缓慢的 stdlibhashlib.md5
实现感到沮丧时,发现这个没有记录。
在 macbook 上:
>>> timeit hashlib.md5(b"hello world")
597 ns ± 17.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> timeit _md5.md5(b"hello world")
224 ns ± 3.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> _md5
<module '_md5' from '/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_md5.cpython-37m-darwin.so'>
Run Code Online (Sandbox Code Playgroud)
在 Windows 盒子上:
>>> timeit hashlib.md5(b"stonk overflow")
328 ns ± 21.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) …
Run Code Online (Sandbox Code Playgroud)