{"id":40808744,"url":"https://github.com/dd86k/ddgst","last_synced_at":"2026-01-21T21:12:38.680Z","repository":{"id":56724844,"uuid":"308931537","full_name":"dd86k/ddgst","owner":"dd86k","description":"#️⃣ dd's hashing utility with a twist","archived":false,"fork":false,"pushed_at":"2025-09-20T20:12:47.000Z","size":359,"stargazers_count":12,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-01T23:37:24.652Z","etag":null,"topics":["blake2","bsd","checksum","crc32","crc64","gnu","hash","sha1","sha2","sha3","shake","sri"],"latest_commit_sha":null,"homepage":"","language":"D","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dd86k.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-10-31T17:05:50.000Z","updated_at":"2025-11-12T00:20:42.000Z","dependencies_parsed_at":"2025-11-15T03:03:00.942Z","dependency_job_id":null,"html_url":"https://github.com/dd86k/ddgst","commit_stats":null,"previous_names":["dd86k/ddgst"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/dd86k/ddgst","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dd86k%2Fddgst","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dd86k%2Fddgst/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dd86k%2Fddgst/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dd86k%2Fddgst/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dd86k","download_url":"https://codeload.github.com/dd86k/ddgst/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dd86k%2Fddgst/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28643113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T18:04:35.752Z","status":"ssl_error","status_checked_at":"2026-01-21T18:03:55.054Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blake2","bsd","checksum","crc32","crc64","gnu","hash","sha1","sha2","sha3","shake","sri"],"created_at":"2026-01-21T21:12:38.261Z","updated_at":"2026-01-21T21:12:38.672Z","avatar_url":"https://github.com/dd86k.png","language":"D","readme":"# ddgst, dd's digest utility\n\nddgst is a simple hasher available cross-platform (Windows, macOS, Linux, BSDs)\nand comes with more features than built-in OS utilities.\n\n## Feature Comparison\n\n| Feature | ddgst | GNU coreutils | uutils/coreutils | OpenSSL [^3] |\n|---|---|---|---|---|\n| Check support | ✔️ | ✔️[^2] | ✔️ | ✔️ |\n| GNU style hashes | ✔️ | ✔️ | ✔️[^4] | ✔️ |\n| BSD style hashes | ✔️ | ✔️ | ✔️ | ✔️ |\n| [SRI style hashes](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) | ✔️ | [^5] | [^5] | [^5] |\n\n## Algorithm Comparison\n\n| Checksum/Hash | ddgst | GNU coreutils | uutils/coreutils | OpenSSL[^3] |\n|---|---|---|---|---|\n| CRC-32 | ✔️ | | | |\n| CRC-64-ISO | ✔️ | | |\n| CRC-64-ECMA | ✔️ | | |\n| MurmurHash3 | ✔️ | | | | |\n| MD5 | ✔️ | ✔️ | ✔️ | ✔️ |\n| RIPEMD-160 | ✔️ | | ✔️ | ✔️ |\n| SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ |\n| SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ |\n| SHA-3/SHAKE | ✔️ | | ✔️ | ✔️ |\n| [BLAKE2b](https://www.blake2.net/) | ✔️ | ✔️ | ✔️[^9] | ✔️ |\n| [BLAKE2s](https://www.blake2.net/) | ✔️ | | | ✔️ |\n| [BLAKE3](https://github.com/BLAKE3-team/BLAKE3/) | | [^6] | ✔️[^9] | | [^8] |\n\n## Algorithm Security\n\n| Checksum/Hash | Type | Secure |\n|---|---|---|\n| CRC-32 | Checksum | ❌ |\n| CRC-64-ISO | Checksum | ❌ |\n| CRC-64-ECMA | Checksum | ❌ |\n| Murmurhash-32 | Hash | ❌ |\n| Murmurhash-128-32 | Hash | ❌ |\n| Murmurhash-128-64 | Hash | ❌ |\n| MD5 | Hash | ❌ |\n| RIPEMD-160 | Hash | ✔️ |\n| SHA-1 | Hash | ❌ |\n| SHA-2 | Hash | ✔️ |\n| SHA-3/SHAKE | Hash | ✔️ |\n| [BLAKE2b](https://www.blake2.net/) | Hash | ✔️ |\n| [BLAKE2s](https://www.blake2.net/) | Hash | ✔️ |\n\n# Usage\n\nUsage:\n- `ddgst [options...] [file|-]`\n- `ddgst [options...] {--check|--autocheck} list`\n- `ddgst [options...] --against=HASH files...`\n- `ddgst [options...] --compare files...`\n- `ddgst [options...] --args text...`\n- `ddgst [options...] --benchmark`\n\nWith no arguments, the help page is shown.\n\nFor a list of options available, use the `--help` argument.\n\nFor a list of supported checksums and hashes, use the `--hashes` switch.\n\n## Hashing files\n\nThe default mode is hashing files and directories using the GNU style.\n\nStyles available:\n\n| Style | Argument |Example |\n|---|---|---|\n| GNU (default) | | `3853e2a78a247145b4aa16667736f6de  LICENSE` |\n| BSD | `--tag` | `MD5(LICENSE)= 3853e2a78a247145b4aa16667736f6de` |\n| SRI | `--sri` | `md5-HSZ86zqNj3XxvjAR7ky/Uw==` |\n| Plain | `--plain` | `3853e2a78a247145b4aa16667736f6de` |\n\n## Check list of hashes\n\nCheck against file list (supports `--tag`):\n```text\n$ ddgst --sha256 -c list\nfile1: OK\nfile2: FAILED\n2 total: 1 mismatch, 0 not read\n```\n\nUsing autodetection:\n```text\n$ ddgst --autocheck list.sha256\nfile: OK\nfile2: FAILED\n2 total: 1 mismatch, 0 not read\n```\n\n## Check files against a hash digest\n\nSupports hex and base64 digests.\n\n```text\n$ ddgst --sha1 LICENSE -A f6067df486cbdbb0aac026b799b26261c92734a3\nLICENSE: OK\n```\n\n## Compare files against each other\n\n```text\n$ ddgst --sha512 --compare LICENSE README.md dub.sdl \nFiles 'LICENSE' and 'README.md' are different\nFiles 'README.md' and 'dub.sdl' are different\nFiles 'LICENSE' and 'dub.sdl' are different\n```\n\n## Hash text entries\n\n```text\n$ ddgst --crc32 --args \"Argument with spaces\" Arguments without spaces\nf17cf59f  \"Argument with spacesArgumentswithoutspaces\"\n```\n\n# Digest parameters\n\nSome hashes may take optional parameters.\n\n- Murmurhash3\n  - The `--seed` option takes an argument literal for seeding the hash.\n  - Can only be a 32-bit integer seed in decimal format.\n- BLAKE2\n  - The `--key` option takes a binary file for keying the hash.\n  - BLAKE2s: Key can be up to 64 Bytes in size.\n  - BLAKE2b: Key can be up to 128 Bytes in size.\n\n# File Pattern Globbing (`*` vs. `'*'`)\n\nThis utility supports file globbing out of the box using `std.file.dirEntries`.\n\nHowever, while useful on Windows, most UNIX-like terminals support in-shell\nglobbing. This may behave differently than the `dirEntries` function.\n\nTo force the usage of the embedded globbing mechanism, you may want to use\n`'*'` or `\\*`. To disable it, use the `--` parameter.\n\nThe globbing pattern is further explained on\n[dlang.org](https://dlang.org/phobos/std_path.html#.globMatch).\n\nThe default parameters used in `dirEntries` are:\n- `SpanMode`: `shallow` (same-level directory);\n- And `followSymlink`: `true` (follows soft symbolic links).\n\n**NOTE**: The embedded globbing system includes hidden files.\n\n**EXAMPLE**: A pattern such as `src/*.{d,dd}`:\n- Matches `src/example.d`, `src/.dd`, and `src/file.dd`;\n- But doesn't match `example.d`, `src/.ddd`, and `src/.e`;\n- Basically all files ending with `.d` and `.dd` in the `src` directory, following symlinks.\n\n# Errors\n\n| Code  | Description |\n|-------|---|\n| 1\t| CLI error |\n| 2\t| No hashes selected or autocheck not used |\n| 3\t| Internal error |\n| 4\t| Failed to set the hash key |\n| 5\t| Failed to set the hash seed |\n| 6\t| Missing entries |\n| 9\t| Could not hash text argument |\n| 10\t| List is empty |\n| 11\t| Unsupported style format |\n| 15\t| Two or more files are required to compare |\n\n# Compiling\n\nCompiling requires a recent D compiler and DUB.\n\nTo compile a debug build with the default compiler:\n```\ndub build\n```\n\nRelease recommendation with the LDC compiler:\n```\ndub build -b release-nobounds --compiler=ldc2\n```\n\nTo compile with GDC, you'll also need gdmd installed.\n\n[^2]: All but cksum and sum.\n[^3]: See `dgst` command.\n[^4]: `*` prepended to filename.\n[^5]: Possible to do with a [chain of commands](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#tools_for_generating_sri_hashes), but good luck remembering them.\n[^6]: While the official BLAKE3 team has a b3sum, GNU does not.\n[^8]: The OpenSSL team is waiting for BLAKE3 to be standardized.\n[^9]: As of 0.0.13","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdd86k%2Fddgst","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdd86k%2Fddgst","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdd86k%2Fddgst/lists"}