Mercurial > ec-dotfiles
changeset 719:bcdf320dabf4
Rewrite the ed2k again in php
Getting openssl to hash md4 is a pain.
author | nanaya <me@nanaya.net> |
---|---|
date | Sun, 10 Dec 2023 00:35:22 +0900 |
parents | 1f8218896f2a |
children | 2cfa6fb4e755 19909a0557af |
files | bin/ed2k bin/ed2k.py |
diffstat | 2 files changed, 25 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/bin/ed2k Mon Dec 19 05:46:25 2022 +0900 +++ b/bin/ed2k Sun Dec 10 00:35:22 2023 +0900 @@ -1,26 +1,27 @@ -#!/usr/bin/env ruby -require 'openssl' +#!/usr/bin/env php +<?php + +function ed2k_hash(string $path): string +{ + // ed2k hash is an md4 hash of concatenated binary md4 hashes of 9500 KiB file chunks. + static $bs = 9500 * 1024; + $hash = ''; + $fp = fopen($path, 'rb'); -def file_ed2k(file_name, output_mode = "hash") - ed2k_block = 9500*1024 #ed2k block size is 9500 KiB - ed2k_hash = "" - file = File.open(file_name, 'rb') - file_size = file.stat.size #while at it, fetch the size of the file - while (block = file.read(ed2k_block)) do - ed2k_hash << OpenSSL::Digest::MD4.digest(block) #hashes are concatenated md4 per block size for ed2k hash - end - ed2k_hash << OpenSSL::Digest::MD4.digest("") if file_size % ed2k_block == 0 #on size of modulo block size, append another md4 hash of a blank string - file.close - ed2k_hash = OpenSSL::Digest::MD4.hexdigest(ed2k_hash) #finally - return case output_mode #there are 2 modes, just the has, or complete with link. - when "hash" - ed2k_hash - when "link" - "ed2k://|file|#{File.basename(file_name)}|#{file_size}|#{ed2k_hash}|" - end -end + while (!feof($fp)) { + $hash .= hash('md4', fread($fp, $bs), true); + } + fclose($fp); + + return hash('md4', $hash); +} -ARGV.each do |file_name| - next unless File.file?(file_name) and File.readable?(file_name) - printf("%s\n", file_ed2k(file_name,"link")) -end +for ($i = 1; $i < $argc; $i++) { + $path = $argv[$i]; + $hash = ed2k_hash($path); + $filename = basename($path); + $filesize = filesize($path); + + echo "ed2k://|file|{$filename}|{$filesize}|{$hash}|"; + echo PHP_EOL; +}
--- a/bin/ed2k.py Mon Dec 19 05:46:25 2022 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#!/usr/bin/env python - -import os, sys -from Crypto.Hash import MD4 - -def ed2k(filename): - block = 9500*1024 - hash = "" - file = open(filename, "rb") - fileblock = file.read(block) - while fileblock: - hash += MD4.new(fileblock).digest() - fileblock = file.read(block) - file.close() - return MD4.new(hash).hexdigest() - -if __name__ == "__main__": - for file in sys.argv[1:]: - print "%s %s" %(ed2k(file), file)