我有一个从文件创建MessageDigest(哈希)的方法,我需要对很多文件(> = 100,000)执行此操作.我应该用多大的缓冲区来读取文件以最大限度地提高性能?
大多数人都熟悉基本代码(我将在这里重复以防万一):
MessageDigest md = MessageDigest.getInstance( "SHA" );
FileInputStream ios = new FileInputStream( "myfile.bmp" );
byte[] buffer = new byte[4 * 1024]; // what should this value be?
int read = 0;
while( ( read = ios.read( buffer ) ) > 0 )
md.update( buffer, 0, read );
ios.close();
md.digest();
Run Code Online (Sandbox Code Playgroud)
什么是最大化吞吐量的缓冲区的理想大小?我知道这是依赖于系统的,我很确定它的操作系统,文件系统和硬盘依赖,并且可能还有其他硬件/软件.
(我应该指出,我对Java有点新手,所以这可能只是一些我不知道的Java API调用.)
编辑:我不提前知道将要使用的系统类型,所以我不能假设很多.(因为那个原因,我正在使用Java.)
编辑:上面的代码缺少像try..catch这样的东西,以使帖子更小
在Scala中编写标准read-while循环的"正确"是什么?正确地说,我的意思是用类似Scala的方式编写而不是类似Java的方式.
这是我在Java中的代码:
MessageDigest md = MessageDigest.getInstance( "MD5" );
InputStream input = new FileInputStream( "file" );
byte[] buffer = new byte[1024];
int readLen;
while( ( readLen = input.read( buffer ) ) != -1 )
md.update( buffer, 0, readLen );
return md.digest();
Run Code Online (Sandbox Code Playgroud)
这是我在Scala中的代码:
val md = MessageDigest.getInstance( hashInfo.algorithm )
val input = new FileInputStream( "file" )
val buffer = new Array[ Byte ]( 1024 )
var readLen = 0
while( readLen != -1 )
{
readLen = input.read( buffer )
if( readLen …Run Code Online (Sandbox Code Playgroud) 我目前面临一个困难的排序问题.我有一组事件需要相互排序(比较排序)和它们在列表中的相对位置.
在最简单的术语中,我有事件列表,每个事件都有一个优先级(整数),一个持续时间(秒),以及事件可以出现在列表中的最早发生时间.我需要根据优先级对事件进行排序,但是在最早发生的时间之前,列表中不会出现任何事件.这是一个(希望)让它更清晰的例子:
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration …Run Code Online (Sandbox Code Playgroud) 我的公司正在努力寻找一种工具来跟踪我们购买的软件(如Office)的序列密钥,以及我们编写和销售的软件.
我们希望软件允许我们将特定计算机与该计算机上的软件以及该软件的序列密钥和许可证相关联.我们还想跟踪计算机的历史记录,例如何时从计算机中删除软件并将其移至另一台计算机.
我查看了谷歌和各种软件网站,但我发现的所有结果都是许可软件和创建序列密钥,而不是管理这些工具生成的序列密钥.我知道这个问题已经解决了; 许多公司许可软件并保留它们生成的序列密钥的记录.所以我很好奇你是否有人在没有编写自己的定制软件的情况下解决了同样的问题?
编辑:我忘了提及,我不是在询问许可软件的优点 - 我们编写的软件不是COTS,购买是在合同级别控制的.不过,我们还需要管理串行密钥的生成方式.
algorithm ×1
buffer ×1
c# ×1
comparison ×1
file-io ×1
filesystems ×1
inputstream ×1
io ×1
java ×1
license-key ×1
licensing ×1
performance ×1
scala ×1
sorting ×1