在本文中,我们将给您介绍关于如何在Java中计算文件的哈希值?的详细内容,并且为您解答如何在java中计算文件的哈希值数的相关问题,此外,我们还将为您提供关于C#我应该使用CertUtil来计算zip
在本文中,我们将给您介绍关于如何在Java中计算文件的哈希值?的详细内容,并且为您解答如何在java中计算文件的哈希值数的相关问题,此外,我们还将为您提供关于C# 我应该使用 CertUtil 来计算 zip 文件的哈希值、go如何计算地图中键的哈希值?、IOS中计算文件的大小、Java中的哈希值的知识。
本文目录一览:- 如何在Java中计算文件的哈希值?(如何在java中计算文件的哈希值数)
- C# 我应该使用 CertUtil 来计算 zip 文件的哈希值
- go如何计算地图中键的哈希值?
- IOS中计算文件的大小
- Java中的哈希值
如何在Java中计算文件的哈希值?(如何在java中计算文件的哈希值数)
我编写了以下程序来计算Java中字符串的SHA-256哈希值:
public class ToHash { public static void main(String[] args) { byte[] data = "test".getBytes("UTF8"); MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(data); System.out.println(new BASE64Encoder().encode(hash)); }}
好吧,那很好。在下一步中,我想以一种接受文件并计算其哈希值的方式来开发它。我的解决方案是在字符串数组中读取整个文件,然后在该字符串数组上调用digest()
方法。但是有两个问题:
我不知道如何将整个文件读入数组?目前,我认为我必须逐行阅读并在数组中添加新行!
上面的方法需要大文件存储空间!
这是我当前的程序来读取文件:
public class ToHash { public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, FileNotFoundException, IOException { // TODO code application logic here // The name of the file to open. String fileName = "C:\\Users\\ghasemi\\Desktop\\1.png"; BufferedReader br = null; try { String sCurrentLine; br = new BufferedReader(new FileReader(fileName)); while ((sCurrentLine = br.readLine()) != null) { byte[] data = sCurrentLine.getBytes("UTF8"); System.out.println(new BASE64Encoder().encode(data)); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException ex) { ex.printStackTrace(); } } }}
似乎没有一种方法可以让BufferedReader
对象一次调用即可读取整个文件。
答案1
小编典典您可以随时读取文件并计算哈希值。
byte[] buffer= new byte[8192]; int count; MessageDigest digest = MessageDigest.getInstance("SHA-256"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName)); while ((count = bis.read(buffer)) > 0) { digest.update(buffer, 0, count); } bis.close(); byte[] hash = digest.digest(); System.out.println(new BASE64Encoder().encode(hash));
这不会假设字符集或文件适合内存,也不会忽略行终止符。
或者您可以使用 DigestInputStream.
C# 我应该使用 CertUtil 来计算 zip 文件的哈希值
是的,基于意见,但这里仍然是我的:
好吧,您要为您创建的每个签名(cmd.exe、certutil.exe 和 2x find.exe)启动 4 个(!)进程。仅此一项就会拖我远离它。
然后,MD5 类正在大量应用程序项目中使用,我想说没有客观的方法可以不信任它们,除非您有一个经过验证的示例表明它们是“错误的”或安全建议等。是这样说的。
最后,MD5
实现无论如何都使用底层 Windows API(请参阅 here 以查看整个兔子)。所以很可能它使用相同的代码(最终)aus CertUtil.exe。
正如您所说,这可能是基于意见的答案,但是我认为坚持使用代码并没有什么问题。在网上搜索,其他人似乎也选择了类似的方法。试试看!
go如何计算地图中键的哈希值?
Go如何计算地图中键的哈希值?它是真正唯一的并且可以在其他结构中使用吗?
我认为对于像int
或不可变的原始键来说很容易,string
但是对于复合结构来说似乎并不平凡。
IOS中计算文件的大小
通常用于删除缓存的时,计算缓存大小
//单个文件的大小
- (long long) fileSizeAtPath:(NSString*) filePath{
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:filePath]){
return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
}
return 0;
}
//遍历文件夹获得文件夹大小,返回多少M
- (float ) folderSizeAtPath:(NSString*) folderPath{
NSFileManager* manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:folderPath]) return 0;
NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:folderPath] objectEnumerator];
NSString* fileName;
long long folderSize = 0;
while ((fileName = [childFilesEnumerator nextObject]) != nil){
NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:fileAbsolutePath];
}
return folderSize/(1024.0*1024.0);
}
Java中的哈希值
1、Hash值有什么用?
HashMap、HashTable、HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提高计算的性能。想想看,一般来说,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O(1)的级别。但是添加元素就不这么乐观了。但是使用hash类的集合,添加元素,移动的元素少,只影响一小块,并且查找元素,由于hash值已经进行了定位分组,所以也会大大缩小涉及面,快速定位。
2、Hash值应该符合什么原则?
A、等幂性。不管执行多少次获取Hash值的操作,只要对象不变,那么Hash值是固定的。如果第一次取跟第N次取不一样,那就用起来很麻烦,需要记录当前是第几次操作,这种需要记录状态的事情,可不是什么好事。
B、对等性。若两个对象equal方法返回为true,则其hash值也应该是一样的。举例说明:若你将objA作为key存入HashMap中,然后new了一个objB。在你看来objB和objA是一个东西(因为他们equal),但是使用objB到hashMap中却取不出来东西。
C、互异性。若两个对象equal方法返回为false,则其hash值最好也是不同的,但这个不是必须的,只是这样做会提高hash类操作的性能(碰撞几率低)。
3、Hash值应该怎么计算?
A、简单计算就是组成成员的hash值直接相加即可。比如ObjectA有三个属性,propA、propB和propC,最直接的计算方式就是propA.hashcode+propB.hashcode+propC.hashcode。
B、但是如果遇到有顺序相关的怎么办?比如String类型是由char数组组成,并且这些数组是有顺序的。如果使用第一种计算方法,则“ABCD”和“BCDA”就会产生同样的hashCode,那么怎么办呢?最直接想到的办法就是加权,不同的index加不同的权值,这个权值的确定最直接的方法就是某个常数值的几次幂。比如为String的计算hash值为K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的选择也有说法,最好不要是偶数,因为偶数的相乘会造成信息的丢失(乘以2就是左移1位,一旦溢出就会造成信息的丢失,这种计算会造成溢出后的值与某个看似不相关的数值得到的结果是一样的),所以最好是奇数,在这一点上比较推荐使用7,因为7=8-1=2^3-1,这样计算的时候,直接左移几位再进行一次普通的加减法即可(Java中常用的是31(32-1=2^5-1))。
今天关于如何在Java中计算文件的哈希值?和如何在java中计算文件的哈希值数的介绍到此结束,谢谢您的阅读,有关C# 我应该使用 CertUtil 来计算 zip 文件的哈希值、go如何计算地图中键的哈希值?、IOS中计算文件的大小、Java中的哈希值等更多相关知识的信息可以在本站进行查询。
本文标签: