下载地址:https://files.1fav.org/s/gJYhx
备用下载地址:
https://wwoy.lanzouu.com/b0fos7p9e
密码:5lrl

简单介绍

一个C#编写的ED2K生成工具,支持批量,支持历史记录
Ps.当然我也知道这种CPU密集型的任务C++或者C才是最好的选择,但是C++没有垃圾回收机制,担心技术不佳导致内存泄露,再就是C#上各种现成的库啊,再就是async / await等等的支持..也可以说是弥补了和C++以及C的缺陷


20250206-2更新记录

  1. 给历史记录窗口加了一个显示当前一共有多少条记录的功能
  2. 增加了一个右键移除选中的功能
  3. 稍微修改了一下拖动选择的判断条件,按住鼠标超过4个像素点才算你想要拖动选择
  4. 刚好清理了一下之前遗留在UI界面中的虚拟表的代码块..😂
  5. 计算完毕之后点击修改HASH值按钮,可以继续再次点击计算,之前还真没考虑到这个..今天刚好用到了.补上

20250206更新记录

这应该是最后一个版本了吧,不想再折腾了,因为我没办法突破系统架构层面的限制,已经在应用层做了很多优化了,现在实测计算一个76.76GB的文件仅需要18秒,在我的工作电脑上,5950X+Samsung SSD 980 PRO 1TB下可以非常稳定的跑,另外我的内存是128 GBDDR4这个稍微有点受限,如果是我另外一台电脑应该可以更低的时间计算完毕.

v1.6.0 更新日志:

  1. 优化大文件处理

    • 新增 BigED2KHash 类专门处理超大文件
    • 10GB以上文件采用高并行处理策略
    • 限制最多同时处理2个大文件,避免资源竞争
  2. 内存管理优化

    • 改进缓冲区分配策略
    • 优化资源释放时机
    • 减少内存压力
  3. 性能优化

    • 增加并行读取流数量
    • 优化计算线程数量
    • 改进任务调度策略
  4. 其他改进

    • 调整文件大小分类阈值
    • 优化进度显示
    • 提升系统稳定性

20250205更新记录

  1. 针对单个大文件重写了并行计算优化,内存管理优化,使用异步I/O操ReadAsync以及设置了合适的文件流选项

    FileOptions.SequentialScan |FileOptions.Asynchronous
  2. 历史记录写入优化,批量写入从1000条改到5000条.
  3. 给主界面UI计算按钮增加一个循环显示.以免以为计算卡住了..现在计算过程中按钮会显示正在计算...后面三个点循环显示

现在实测一个80G的文件37秒算完,之前需要1分58秒,历史记录的写入改到5000条每批次写入,因为写入速度跟不上小文件的计算速度了.1万个小文件计算只需要2秒不到...

20250204更新记录

春节也过完了,第一件事当然就是把这个...没人用的软件给做完.

  1. 考虑到性能,使用SQLite来代替Json保存历史记录,所以多了一个DLL文件,本来也想打包到独立EXE里面去的..算了
  2. 去掉了春节前最后一次修改使用的FastObjectListView 还是继续使用VirtualListView,不过和历史记录一样都增加了双缓冲.总之就是比之前好
  3. 把计算单元和列队单元分开了,现在计算几万个文件没任何压力.
  4. 然后修改了内存的回收机制.现在计算大量的大文件内存占用也会超低,内存回收也非常快.因为对20250125的第六条不是很满意,所以单独去研究了下.NET的内存回收机制和池的使用以及回收复用等等
  5. 去掉了手动控制多个文件同时计算和单文件多线程计算的功能,由程序自动识别当前系统的配置和负载来决定,反正也是吊打我能见到的所有ED2K软件的计算速度.
  6. 增加了简单的历史记录搜索功能
  7. 吃了个宵夜回来给搜索功能补了一个通配符搜索功能,鼠标移动到搜索框有提示帮助
  8. 吃宵夜的过程中想了一下虚拟表的缓存清理机制可能写的不对,又改了下,现在连续计算大量小文件之后,虚拟表不会出现绘制出错的问题了,包括历史记录表也是.
  9. 洗了个澡,给程序增加了一个最小化到托盘的功能,同时增加了一个历史记录的右键菜单,可以直接在托盘中打开历史记录,主打的就是一个随心随性,要什么自己造
  10. 起床还是决定把SQLite的DLL打包进去,做成单个文件,然后改了几个字符串..描述性错误

20250125更新记录

  1. 去掉TextBox控件,改用基于Listview绘制的VirtualListView来进行展示数据,解决之前计算时候不停闪屏问题,包括历史记录表格也是
  2. 增加了调用历史记录的功能,计算已经计算过的文件时直接调用历史记录(可自行在设置中关闭).使用的是文件特征码来记录是否计算过.计算一个文件的特征码以我自己的7950X3D为例,只要2微秒不到,所以不影响性能,10000个文件也才20毫秒不到的级别.而且主要消耗的时间还是在Fileinfo的创建上..
  3. 给历史记录展示增加双缓存,测试打开100万条记录和打开1条记录没区别,主要还是因为VirtualListView我在绘制的时候也加了缓存,而且数据的展示是实时绘制,并不是一次加载100万条记录
  4. 优化了文件处理列队,怕万一有人无聊要计算几万个文件甚至几十万个文件.. 20250204已解决
  5. 去掉除了清理历史记录的所有弹窗提示,改用Toast来提示.
  6. 改进了内存管理和资源释放,因为如果你们和我一样设置一个文件使用20,甚至30个线程去计算,你的物理内存使用会飙升.这个改动就是为了更好的回收线程和释放资源,另外因为.NET TP Worker线程无法直接管理,我设置了一个每次执行之后的定时任务来释放和回收内存.
  7. 还有其他一些巴拉巴拉的就不哔哔了,什么优化了一下代码结构,也是方便自己,把一些常用的封装起来了,然后再就是更好的异常处理之类的...
  8. 起床之后又修改了一个地方,修改历史记录中之前的遍历法为枚举加字典的方法



因为这次考虑到了可能会计算大量的超大文件,所以用了.NET8.0,当然也是为了性能才会这么选.然后本来想自己写MD4算法,但是失败了,然后用了NuGet中的Portable.BouncyCastle包来算,不过包是死的,人是活的嘛,我在其中加入了对单个文件进行多线程计算的功能,目前链接生成速度是吊打我能见到的所有ED2K链接生成工具