{"id":190,"name":null,"description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","url":"https://github.com/liufengyun/hashdiff","last_synced_at":"2026-04-30T19:30:19.587Z","repository":{"id":3360004,"uuid":"4405769","full_name":"liufengyun/hashdiff","owner":"liufengyun","description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","archived":false,"fork":false,"pushed_at":"2025-09-06T06:47:07.000Z","size":295,"stargazers_count":629,"open_issues_count":13,"forks_count":64,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-04-11T10:03:04.123Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liufengyun.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","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":"2012-05-22T11:18:45.000Z","updated_at":"2026-04-10T21:40:10.000Z","dependencies_parsed_at":"2024-06-02T21:26:24.059Z","dependency_job_id":"2a9376ff-cd7b-4853-a196-d818fb22fc78","html_url":"https://github.com/liufengyun/hashdiff","commit_stats":{"total_commits":150,"total_committers":28,"mean_commits":5.357142857142857,"dds":0.5666666666666667,"last_synced_commit":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/liufengyun/hashdiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/sbom","scorecard":{"id":593416,"data":{"date":"2025-08-11","repo":{"name":"github.com/liufengyun/hashdiff","commit":"d07488a5078b66b209151f74200abe39d9a65a9d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":6,"reason":"Found 10/15 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:32:15.862Z","repository_id":3360004,"created_at":"2025-08-20T22:32:15.862Z","updated_at":"2025-08-20T22:32:15.862Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31749762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"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"}},"owner":{"login":"liufengyun","name":"Fengyun Liu","uuid":"754633","kind":"user","description":"Programmer interested in programming languages and formal methods","email":"","website":"https://fengy.me","location":"Lausanne, Switzerland","twitter":null,"company":"Oracle Labs","icon_url":"https://avatars.githubusercontent.com/u/754633?v=4","repositories_count":58,"last_synced_at":"2024-04-14T07:21:58.025Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/liufengyun","funding_links":[],"total_stars":723,"followers":257,"following":53,"created_at":"2022-11-02T16:17:20.437Z","updated_at":"2024-04-14T07:22:11.528Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun/repositories"},"packages":[{"id":13406721,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-06T15:17:50.151Z","latest_release_published_at":"2026-02-06T15:17:50.151Z","latest_release_number":"1.1.0-1","last_synced_at":"2026-03-06T15:59:43.825Z","created_at":"2026-02-06T15:17:38.843Z","updated_at":"2026-03-06T16:04:38.063Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.6.2","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":null,"dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-24.04","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-24.04","url":"https://launchpad.net/ubuntu/noble","ecosystem":"ubuntu","default":true,"packages_count":37306,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"noble"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:45.928Z","updated_at":"2026-04-27T18:20:35.701Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/namespaces"}},{"id":13751150,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T07:14:51.342Z","latest_release_published_at":"2026-02-13T07:14:51.342Z","latest_release_number":"1.0.0-1","last_synced_at":"2026-03-13T20:24:47.721Z","created_at":"2026-02-13T07:14:51.171Z","updated_at":"2026-03-13T20:24:47.722Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.4.0","maintainer":"Debian Ruby Extras Maintainers \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 12), gem2deb, rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{"id":3360004,"uuid":"4405769","full_name":"liufengyun/hashdiff","owner":"liufengyun","description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","archived":false,"fork":false,"pushed_at":"2025-09-06T06:47:07.000Z","size":295,"stargazers_count":629,"open_issues_count":13,"forks_count":65,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-02-11T07:23:04.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liufengyun.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","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":"2012-05-22T11:18:45.000Z","updated_at":"2026-02-05T20:59:07.000Z","dependencies_parsed_at":"2024-06-02T21:26:24.059Z","dependency_job_id":"2a9376ff-cd7b-4853-a196-d818fb22fc78","html_url":"https://github.com/liufengyun/hashdiff","commit_stats":{"total_commits":150,"total_committers":28,"mean_commits":5.357142857142857,"dds":0.5666666666666667,"last_synced_commit":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/liufengyun/hashdiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/sbom","scorecard":{"id":593416,"data":{"date":"2025-08-11","repo":{"name":"github.com/liufengyun/hashdiff","commit":"d07488a5078b66b209151f74200abe39d9a65a9d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":6,"reason":"Found 10/15 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:32:15.862Z","repository_id":3360004,"created_at":"2025-08-20T22:32:15.862Z","updated_at":"2025-08-20T22:32:15.862Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29359361,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T01:03:07.613Z","status":"online","status_checked_at":"2026-02-12T02:00:06.911Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"}},"repo_metadata_updated_at":"2026-02-13T07:14:51.514Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":0.7902597648126443,"forks_count":1.0856407928582235,"docker_downloads_count":null,"average":0.46897513941771696},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-20.04\u0026repository_url=https://launchpad.net/ubuntu/focal","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-20.04","url":"https://launchpad.net/ubuntu/focal","ecosystem":"ubuntu","default":false,"packages_count":30789,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"focal"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:47.233Z","updated_at":"2026-04-27T18:20:36.874Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/namespaces"}},{"id":13605575,"name":"ruby-hashdiff","ecosystem":"debian","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-11T11:21:17.012Z","latest_release_published_at":"2026-02-11T11:21:17.012Z","latest_release_number":"0.2.3-1","last_synced_at":"2026-03-13T19:03:57.445Z","created_at":"2026-02-11T11:21:16.826Z","updated_at":"2026-03-13T19:03:57.445Z","registry_url":"https://tracker.debian.org/pkg/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":"https://packages.debian.org/buster/ruby-hashdiff","metadata":{"component":"main","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"3.9.6","maintainer":"Debian Ruby Extras Maintainers \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper (\u003e= 9~), gem2deb, rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T15:15:08.507Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-hashdiff?arch=source\u0026distro=debian-10\u0026repository_url=https://packages.debian.org/buster","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"debian-10","url":"https://packages.debian.org/buster","ecosystem":"debian","default":false,"packages_count":28836,"maintainers_count":0,"namespaces_count":3,"keywords_count":915,"github":"debian","metadata":{"codename":"buster","mirror":"http://archive.debian.org/debian"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:50.156Z","updated_at":"2026-04-27T18:20:39.693Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/namespaces"}},{"id":13804502,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T18:22:18.347Z","latest_release_published_at":"2026-02-13T18:22:18.347Z","latest_release_number":"1.0.1-1","last_synced_at":"2026-03-14T03:14:27.904Z","created_at":"2026-02-13T18:22:17.762Z","updated_at":"2026-03-14T03:14:27.904Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.5.1","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-13T18:24:20.989Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-23.10\u0026repository_url=https://launchpad.net/ubuntu/mantic","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-23.10","url":"https://launchpad.net/ubuntu/mantic","ecosystem":"ubuntu","default":false,"packages_count":36642,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"mantic","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:48.636Z","updated_at":"2026-04-27T18:20:38.051Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/namespaces"}},{"id":13530388,"name":"ruby-hashdiff","ecosystem":"debian","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-10T23:31:56.836Z","latest_release_published_at":"2026-02-10T23:31:56.836Z","latest_release_number":"1.0.1-1","last_synced_at":"2026-03-14T06:23:11.130Z","created_at":"2026-02-10T23:31:56.653Z","updated_at":"2026-03-14T06:23:11.130Z","registry_url":"https://tracker.debian.org/pkg/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":"https://packages.debian.org/bullseye/ruby-hashdiff","metadata":{"component":"main","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.5.1","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T14:26:38.601Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-hashdiff?arch=source\u0026distro=debian-11\u0026repository_url=https://packages.debian.org/bullseye","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"debian-11","url":"https://packages.debian.org/bullseye","ecosystem":"debian","default":false,"packages_count":31268,"maintainers_count":0,"namespaces_count":3,"keywords_count":0,"github":"debian","metadata":{"codename":"bullseye"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:49.702Z","updated_at":"2026-04-27T18:20:39.352Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/namespaces"}},{"id":222316,"name":"hashdiff","ecosystem":"rubygems","description":" Hashdiff is a diff lib to compute the smallest difference between two hashes. ","homepage":"https://github.com/liufengyun/hashdiff","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":[],"namespace":null,"versions_count":29,"first_release_published_at":"2012-05-22T14:21:30.006Z","latest_release_published_at":"2025-09-06T06:48:17.268Z","latest_release_number":"1.2.1","last_synced_at":"2026-04-29T07:28:02.583Z","created_at":"2022-04-06T00:29:55.181Z","updated_at":"2026-04-29T07:28:02.583Z","registry_url":"https://rubygems.org/gems/hashdiff","install_command":"gem install hashdiff -s https://rubygems.org","documentation_url":"http://www.rubydoc.info/gems/hashdiff/","metadata":{"funding":null},"repo_metadata":{"id":3360004,"uuid":"4405769","full_name":"liufengyun/hashdiff","owner":"liufengyun","description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","archived":false,"fork":false,"pushed_at":"2025-09-06T06:47:07.000Z","size":295,"stargazers_count":629,"open_issues_count":13,"forks_count":64,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-04-11T10:03:04.123Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liufengyun.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","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":"2012-05-22T11:18:45.000Z","updated_at":"2026-04-10T21:40:10.000Z","dependencies_parsed_at":"2024-06-02T21:26:24.059Z","dependency_job_id":"2a9376ff-cd7b-4853-a196-d818fb22fc78","html_url":"https://github.com/liufengyun/hashdiff","commit_stats":{"total_commits":150,"total_committers":28,"mean_commits":5.357142857142857,"dds":0.5666666666666667,"last_synced_commit":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/liufengyun/hashdiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/sbom","scorecard":{"id":593416,"data":{"date":"2025-08-11","repo":{"name":"github.com/liufengyun/hashdiff","commit":"d07488a5078b66b209151f74200abe39d9a65a9d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":6,"reason":"Found 10/15 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:32:15.862Z","repository_id":3360004,"created_at":"2025-08-20T22:32:15.862Z","updated_at":"2025-08-20T22:32:15.862Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31749762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"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"},"tags":[]},"repo_metadata_updated_at":"2026-04-29T07:28:02.067Z","dependent_packages_count":108,"downloads":392916856,"downloads_period":"total","dependent_repos_count":30642,"rankings":{"downloads":0.07080652535096621,"dependent_repos_count":0.1979237519652992,"dependent_packages_count":0.3088725594050022,"stargazers_count":2.4860338310232937,"forks_count":3.3608010615403487,"docker_downloads_count":0.12655969491865612,"average":1.0918329040339276},"purl":"pkg:gem/hashdiff","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/hashdiff","docker_dependents_count":983,"docker_downloads_count":2141149653,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/hashdiff/dependencies","status":null,"funding_links":[],"critical":true,"issue_metadata":{"last_synced_at":"2026-04-15T07:30:31.251Z","issues_count":40,"pull_requests_count":68,"avg_time_to_close_issue":9621593.103448275,"avg_time_to_close_pull_request":252679.46774193548,"issues_closed_count":29,"pull_requests_closed_count":62,"pull_request_authors_count":38,"issue_authors_count":35,"avg_comments_per_issue":3.925,"avg_comments_per_pull_request":1.8235294117647058,"merged_pull_requests_count":53,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":79259.0,"past_year_avg_time_to_close_pull_request":37505.0,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.6666666666666666,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/issues","maintainers":[{"login":"krzysiek1507","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"},{"login":"liufengyun","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/liufengyun"}],"active_maintainers":[{"login":"krzysiek1507","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/hashdiff/codemeta","maintainers":[{"uuid":"59819","login":"liufengyun","name":null,"email":null,"url":null,"packages_count":5,"html_url":"https://rubygems.org/profiles/liufengyun","role":null,"created_at":"2022-11-09T09:34:45.831Z","updated_at":"2022-11-09T09:34:45.831Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/liufengyun/packages"}],"registry":{"name":"rubygems.org","url":"https://rubygems.org","ecosystem":"rubygems","default":true,"packages_count":205541,"maintainers_count":68469,"namespaces_count":0,"keywords_count":0,"github":"rubygems","metadata":{"funded_packages_count":7260},"icon_url":"https://github.com/rubygems.png","created_at":"2022-04-04T15:19:23.446Z","updated_at":"2026-04-03T06:42:17.024Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/namespaces"}},{"id":8614030,"name":"github.com/liufengyun/hashdiff","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":[],"namespace":null,"versions_count":12,"first_release_published_at":"2017-08-22T18:50:15.000Z","latest_release_published_at":"2025-09-06T06:46:16.000Z","latest_release_number":"v1.2.1","last_synced_at":"2026-04-29T07:28:22.849Z","created_at":"2023-12-02T02:11:21.997Z","updated_at":"2026-04-29T07:28:22.849Z","registry_url":"https://pkg.go.dev/github.com/liufengyun/hashdiff","install_command":"go get github.com/liufengyun/hashdiff","documentation_url":"https://pkg.go.dev/github.com/liufengyun/hashdiff#section-documentation","metadata":{},"repo_metadata":{"id":3360004,"uuid":"4405769","full_name":"liufengyun/hashdiff","owner":"liufengyun","description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","archived":false,"fork":false,"pushed_at":"2025-09-06T06:47:07.000Z","size":295,"stargazers_count":620,"open_issues_count":13,"forks_count":65,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-10-19T17:49:36.393Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liufengyun.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","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":"2012-05-22T11:18:45.000Z","updated_at":"2025-10-17T15:23:23.000Z","dependencies_parsed_at":"2024-06-02T21:26:24.059Z","dependency_job_id":"2a9376ff-cd7b-4853-a196-d818fb22fc78","html_url":"https://github.com/liufengyun/hashdiff","commit_stats":{"total_commits":150,"total_committers":28,"mean_commits":5.357142857142857,"dds":0.5666666666666667,"last_synced_commit":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/liufengyun/hashdiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/sbom","scorecard":{"id":593416,"data":{"date":"2025-08-11","repo":{"name":"github.com/liufengyun/hashdiff","commit":"d07488a5078b66b209151f74200abe39d9a65a9d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":6,"reason":"Found 10/15 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:32:15.862Z","repository_id":3360004,"created_at":"2025-08-20T22:32:15.862Z","updated_at":"2025-08-20T22:32:15.862Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279904405,"owners_count":26241850,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-19T02:00:07.647Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"},"owner_record":{"login":"liufengyun","name":"Fengyun Liu","uuid":"754633","kind":"user","description":"Programmer interested in programming languages and formal methods","email":"","website":"https://fengy.me","location":"Lausanne, Switzerland","twitter":null,"company":"Oracle Labs","icon_url":"https://avatars.githubusercontent.com/u/754633?v=4","repositories_count":58,"last_synced_at":"2024-04-14T07:21:58.025Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/liufengyun","funding_links":[],"total_stars":723,"followers":257,"following":53,"created_at":"2022-11-02T16:17:20.437Z","updated_at":"2024-04-14T07:22:11.528Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun/repositories"},"tags":[{"name":"v1.2.1","sha":"d6ac7e74ee5b362e067e27312ec7545c7845ce45","kind":"commit","published_at":"2025-09-06T06:46:16.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.2.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.1/manifests"},{"name":"v1.2.0","sha":"d07488a5078b66b209151f74200abe39d9a65a9d","kind":"commit","published_at":"2025-05-20T19:19:01.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.2.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.0/manifests"},{"name":"v1.1.2","sha":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd","kind":"commit","published_at":"2024-11-12T06:29:28.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.2","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.2/manifests"},{"name":"v1.1.1","sha":"1117c26d7747bb6c7c3db71431a52c4256ffae55","kind":"commit","published_at":"2024-08-02T12:52:28.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.1/manifests"},{"name":"v1.1.0","sha":"1355fdaa33963fe78d8f77b61ea937b18a01460c","kind":"commit","published_at":"2023-12-14T23:20:13.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.0/manifests"},{"name":"v1.0.1","sha":"7c704827f9fb10cffae000d446b55aa2307eab86","kind":"commit","published_at":"2020-02-27T19:38:53.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.1/manifests"},{"name":"v1.0.0","sha":"fcb97f1038339f89cd8d6ffde594fb03d4190edf","kind":"commit","published_at":"2019-07-15T05:51:07.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0/manifests"},{"name":"v1.0.0.beta1","sha":"8cbe4b84f4088ddd8634b8400157cce7ba77886b","kind":"commit","published_at":"2019-06-06T16:46:07.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.0.beta1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.0.beta1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.0.beta1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0.beta1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0.beta1/manifests"},{"name":"v0.4.0","sha":"d65abffeef6b67a0765c8fd107f4335c0347ee6f","kind":"commit","published_at":"2019-05-28T19:06:00.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.4.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.4.0/manifests"},{"name":"rm","sha":"e021af223b8d2028be6f92a9bfb85c9c0391cec2","kind":"commit","published_at":"2019-05-28T18:57:48.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/rm","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/rm","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@rm","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/rm","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/rm/manifests"},{"name":"v0.3.9","sha":"052b9c0238190d9dcf4c845baa3d64609fbef9c1","kind":"commit","published_at":"2019-04-22T19:44:50.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.9","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.9/manifests"},{"name":"v0.3.8","sha":"bf2da6e3bd8b014bb8cbb9fb4267941745986bf1","kind":"commit","published_at":"2018-12-30T18:46:11.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.8","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.8/manifests"},{"name":"v0.3.7","sha":"0946ded222b24ff35448205074fa2f20b87623b1","kind":"commit","published_at":"2017-10-08T11:06:49.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.7","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.7/manifests"},{"name":"v0.3.6","sha":"8c40f161d84f3586764c1fe288161c3957b7edbd","kind":"commit","published_at":"2017-08-22T18:50:15.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.6","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.6/manifests"}]},"repo_metadata_updated_at":"2025-10-21T09:28:59.622Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":10.801592556016239,"dependent_packages_count":9.575730298247606,"stargazers_count":2.6480084819648013,"forks_count":3.152360754324224,"docker_downloads_count":null,"average":6.544423022638218},"purl":"pkg:golang/github.com/liufengyun/hashdiff","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/liufengyun/hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/liufengyun/hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/liufengyun/hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-09-07T11:36:39.493Z","issues_count":40,"pull_requests_count":68,"avg_time_to_close_issue":9621593.103448275,"avg_time_to_close_pull_request":252679.46774193548,"issues_closed_count":29,"pull_requests_closed_count":62,"pull_request_authors_count":38,"issue_authors_count":35,"avg_comments_per_issue":3.925,"avg_comments_per_pull_request":1.8235294117647058,"merged_pull_requests_count":53,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":79259.0,"past_year_avg_time_to_close_pull_request":37505.0,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.6666666666666666,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/issues","maintainers":[{"login":"krzysiek1507","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"},{"login":"liufengyun","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/liufengyun"}],"active_maintainers":[{"login":"krzysiek1507","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fliufengyun%2Fhashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fliufengyun%2Fhashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fliufengyun%2Fhashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fliufengyun%2Fhashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fliufengyun%2Fhashdiff/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2118892,"maintainers_count":0,"namespaces_count":782439,"keywords_count":112823,"github":"golang","metadata":{"funded_packages_count":53495},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-19T05:14:45.920Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},{"id":13566534,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-11T06:40:46.030Z","latest_release_published_at":"2026-02-11T06:40:46.030Z","latest_release_number":"1.0.1-1","last_synced_at":"2026-03-11T15:28:33.229Z","created_at":"2026-02-11T06:40:45.853Z","updated_at":"2026-03-11T15:28:33.229Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.5.1","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T14:56:24.735Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-23.04\u0026repository_url=https://launchpad.net/ubuntu/lunar","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-23.04","url":"https://launchpad.net/ubuntu/lunar","ecosystem":"ubuntu","default":false,"packages_count":36116,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"lunar","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:49.117Z","updated_at":"2026-04-27T18:20:38.741Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/namespaces"}},{"id":13950172,"name":"ruby-hashdiff","ecosystem":"guix","description":"HashDiff computes the smallest difference between two hashes","homepage":"https://github.com/liufengyun/hashdiff","licenses":"expat","normalized_licenses":["Other"],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2026-03-02T18:52:18.539Z","latest_release_published_at":"2026-03-02T18:52:18.539Z","latest_release_number":"1.0.1","last_synced_at":"2026-04-27T16:20:08.821Z","created_at":"2026-03-02T18:52:18.340Z","updated_at":"2026-04-27T16:20:08.821Z","registry_url":"https://packages.guix.gnu.org/packages/ruby-hashdiff/1.0.1/","install_command":"guix install ruby-hashdiff","documentation_url":"https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/ruby-xyz.scm#n3646","metadata":{"location":"gnu/packages/ruby-xyz.scm:3646","variable_name":"ruby-hashdiff"},"repo_metadata":{},"repo_metadata_updated_at":"2026-04-03T00:24:12.365Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:guix/ruby-hashdiff","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/guix/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/guix/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/guix/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"guix","url":"https://guix.gnu.org","ecosystem":"guix","default":true,"packages_count":31189,"maintainers_count":0,"namespaces_count":0,"keywords_count":0,"github":"guix-mirror","metadata":{"funded_packages_count":286},"icon_url":"https://github.com/guix-mirror.png","created_at":"2026-03-02T16:23:46.981Z","updated_at":"2026-04-03T06:23:21.396Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/guix/namespaces"}},{"id":13466782,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-09T16:40:57.768Z","latest_release_published_at":"2026-02-09T16:40:57.768Z","latest_release_number":"1.1.0-1","last_synced_at":"2026-03-09T17:06:39.406Z","created_at":"2026-02-09T16:40:56.503Z","updated_at":"2026-03-09T17:32:06.644Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.6.2","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":null,"dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-24.10\u0026repository_url=https://launchpad.net/ubuntu/oracular","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-24.10","url":"https://launchpad.net/ubuntu/oracular","ecosystem":"ubuntu","default":false,"packages_count":38437,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"oracular","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:48.028Z","updated_at":"2026-04-27T18:20:37.303Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/namespaces"}},{"id":13778991,"name":"ruby-hashdiff","ecosystem":"ubuntu","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T13:18:08.129Z","latest_release_published_at":"2026-02-13T13:18:08.129Z","latest_release_number":"1.0.1-1","last_synced_at":"2026-03-13T22:37:40.670Z","created_at":"2026-02-13T13:18:07.911Z","updated_at":"2026-03-13T22:37:40.671Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.5.1","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-13T13:18:13.348Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-hashdiff?arch=source\u0026distro=ubuntu-22.04\u0026repository_url=https://launchpad.net/ubuntu/jammy","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"ubuntu-22.04","url":"https://launchpad.net/ubuntu/jammy","ecosystem":"ubuntu","default":false,"packages_count":34289,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"jammy"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:46.486Z","updated_at":"2026-04-27T18:20:36.155Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/namespaces"}},{"id":13712519,"name":"ruby-hashdiff","ecosystem":"debian","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-12T23:32:00.700Z","latest_release_published_at":"2026-02-12T23:32:00.700Z","latest_release_number":"1.0.1-1","last_synced_at":"2026-03-13T23:44:33.132Z","created_at":"2026-02-12T23:32:00.476Z","updated_at":"2026-03-14T00:02:15.795Z","registry_url":"https://tracker.debian.org/pkg/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":"https://packages.debian.org/bookworm/ruby-hashdiff","metadata":{"component":"main","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.5.1","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-12T23:32:01.229Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-hashdiff?arch=source\u0026distro=debian-12","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"debian-12","url":"https://packages.debian.org/bookworm","ecosystem":"debian","default":true,"packages_count":34734,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"debian","metadata":{"codename":"bookworm"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:49.459Z","updated_at":"2026-04-27T18:20:38.992Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/namespaces"}},{"id":12243380,"name":"hashdiff","ecosystem":"rubygems","description":" Hashdiff is a diff lib to compute the smallest difference between two hashes. ","homepage":"https://github.com/liufengyun/hashdiff","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":[],"namespace":null,"versions_count":29,"first_release_published_at":"2012-05-22T14:21:30.006Z","latest_release_published_at":"2025-09-06T06:48:17.268Z","latest_release_number":"1.2.1","last_synced_at":"2026-04-29T18:00:34.069Z","created_at":"2025-10-07T03:24:01.296Z","updated_at":"2026-04-29T18:05:25.130Z","registry_url":"https://gem.coop/gems/hashdiff","install_command":"gem install hashdiff -s https://gem.coop","documentation_url":"http://www.rubydoc.info/gems/hashdiff/","metadata":{"funding":null},"repo_metadata":{"id":3360004,"uuid":"4405769","full_name":"liufengyun/hashdiff","owner":"liufengyun","description":"Hashdiff is a ruby library to to compute the smallest difference between two hashes","archived":false,"fork":false,"pushed_at":"2025-09-06T06:47:07.000Z","size":295,"stargazers_count":629,"open_issues_count":13,"forks_count":64,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-04-11T10:03:04.123Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liufengyun.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","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":"2012-05-22T11:18:45.000Z","updated_at":"2026-04-10T21:40:10.000Z","dependencies_parsed_at":"2024-06-02T21:26:24.059Z","dependency_job_id":"2a9376ff-cd7b-4853-a196-d818fb22fc78","html_url":"https://github.com/liufengyun/hashdiff","commit_stats":{"total_commits":150,"total_committers":28,"mean_commits":5.357142857142857,"dds":0.5666666666666667,"last_synced_commit":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/liufengyun/hashdiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/sbom","scorecard":{"id":593416,"data":{"date":"2025-08-11","repo":{"name":"github.com/liufengyun/hashdiff","commit":"d07488a5078b66b209151f74200abe39d9a65a9d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":6,"reason":"Found 10/15 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/liufengyun/hashdiff/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T22:32:15.862Z","repository_id":3360004,"created_at":"2025-08-20T22:32:15.862Z","updated_at":"2025-08-20T22:32:15.862Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31749762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"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"},"owner_record":{"login":"liufengyun","name":"Fengyun Liu","uuid":"754633","kind":"user","description":"Programmer interested in programming languages and formal methods","email":"","website":"https://fengy.me","location":"Lausanne, Switzerland","twitter":null,"company":"Oracle Labs","icon_url":"https://avatars.githubusercontent.com/u/754633?v=4","repositories_count":58,"last_synced_at":"2024-04-14T07:21:58.025Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/liufengyun","funding_links":[],"total_stars":723,"followers":257,"following":53,"created_at":"2022-11-02T16:17:20.437Z","updated_at":"2024-04-14T07:22:11.528Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liufengyun/repositories"},"tags":[{"name":"v1.2.1","sha":"d6ac7e74ee5b362e067e27312ec7545c7845ce45","kind":"commit","published_at":"2025-09-06T06:46:16.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.2.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.1/manifests"},{"name":"v1.2.0","sha":"d07488a5078b66b209151f74200abe39d9a65a9d","kind":"commit","published_at":"2025-05-20T19:19:01.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.2.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.2.0/manifests"},{"name":"v1.1.2","sha":"b7734e3a29d6680b8371a7bc2c8fe149961b8abd","kind":"commit","published_at":"2024-11-12T06:29:28.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.2","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.2/manifests"},{"name":"v1.1.1","sha":"1117c26d7747bb6c7c3db71431a52c4256ffae55","kind":"commit","published_at":"2024-08-02T12:52:28.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.1/manifests"},{"name":"v1.1.0","sha":"1355fdaa33963fe78d8f77b61ea937b18a01460c","kind":"commit","published_at":"2023-12-14T23:20:13.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.1.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.1.0/manifests"},{"name":"v1.0.1","sha":"7c704827f9fb10cffae000d446b55aa2307eab86","kind":"commit","published_at":"2020-02-27T19:38:53.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.1/manifests"},{"name":"v1.0.0","sha":"fcb97f1038339f89cd8d6ffde594fb03d4190edf","kind":"commit","published_at":"2019-07-15T05:51:07.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0/manifests"},{"name":"v1.0.0.beta1","sha":"8cbe4b84f4088ddd8634b8400157cce7ba77886b","kind":"commit","published_at":"2019-06-06T16:46:07.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v1.0.0.beta1","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v1.0.0.beta1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v1.0.0.beta1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0.beta1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v1.0.0.beta1/manifests"},{"name":"v0.4.0","sha":"d65abffeef6b67a0765c8fd107f4335c0347ee6f","kind":"commit","published_at":"2019-05-28T19:06:00.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.4.0","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.4.0/manifests"},{"name":"rm","sha":"e021af223b8d2028be6f92a9bfb85c9c0391cec2","kind":"commit","published_at":"2019-05-28T18:57:48.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/rm","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/rm","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@rm","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/rm","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/rm/manifests"},{"name":"v0.3.9","sha":"052b9c0238190d9dcf4c845baa3d64609fbef9c1","kind":"commit","published_at":"2019-04-22T19:44:50.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.9","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.9/manifests"},{"name":"v0.3.8","sha":"bf2da6e3bd8b014bb8cbb9fb4267941745986bf1","kind":"commit","published_at":"2018-12-30T18:46:11.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.8","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.8/manifests"},{"name":"v0.3.7","sha":"0946ded222b24ff35448205074fa2f20b87623b1","kind":"commit","published_at":"2017-10-08T11:06:49.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.7","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.7/manifests"},{"name":"v0.3.6","sha":"8c40f161d84f3586764c1fe288161c3957b7edbd","kind":"commit","published_at":"2017-08-22T18:50:15.000Z","download_url":"https://codeload.github.com/liufengyun/hashdiff/tar.gz/v0.3.6","html_url":"https://github.com/liufengyun/hashdiff/releases/tag/v0.3.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/liufengyun/hashdiff@v0.3.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/tags/v0.3.6/manifests"}]},"repo_metadata_updated_at":"2026-04-29T18:05:25.129Z","dependent_packages_count":0,"downloads":393071514,"downloads_period":"total","dependent_repos_count":0,"rankings":{"downloads":0.06217661402380013,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":0.051903956054650535,"average":0.028520142519612664},"purl":"pkg:gem/hashdiff?repository_url=https://gem.coop","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/hashdiff","docker_dependents_count":983,"docker_downloads_count":2141149653,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-04-15T07:30:31.251Z","issues_count":40,"pull_requests_count":68,"avg_time_to_close_issue":9621593.103448275,"avg_time_to_close_pull_request":252679.46774193548,"issues_closed_count":29,"pull_requests_closed_count":62,"pull_request_authors_count":38,"issue_authors_count":35,"avg_comments_per_issue":3.925,"avg_comments_per_pull_request":1.8235294117647058,"merged_pull_requests_count":53,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":79259.0,"past_year_avg_time_to_close_pull_request":37505.0,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.6666666666666666,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/issues","maintainers":[{"login":"krzysiek1507","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"},{"login":"liufengyun","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/liufengyun"}],"active_maintainers":[{"login":"krzysiek1507","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/hashdiff/codemeta","maintainers":[{"uuid":"59819","login":"liufengyun","name":null,"email":null,"url":null,"packages_count":5,"html_url":"https://gem.coop/profiles/liufengyun","role":null,"created_at":"2025-10-07T20:14:38.112Z","updated_at":"2025-10-07T20:14:38.112Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/liufengyun/packages"}],"registry":{"name":"gem.coop","url":"https://gem.coop","ecosystem":"rubygems","default":false,"packages_count":190394,"maintainers_count":67477,"namespaces_count":0,"keywords_count":0,"github":"gem-coop","metadata":{"funded_packages_count":6507},"icon_url":"https://github.com/gem-coop.png","created_at":"2025-10-06T17:24:20.932Z","updated_at":"2026-04-03T06:45:05.763Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/namespaces"}},{"id":13668994,"name":"ruby-hashdiff","ecosystem":"debian","description":null,"homepage":"https://github.com/liufengyun/hashdiff","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/liufengyun/hashdiff","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-12T12:26:34.057Z","latest_release_published_at":"2026-02-12T12:26:34.057Z","latest_release_number":"1.1.0-1","last_synced_at":"2026-03-14T18:09:38.879Z","created_at":"2026-02-12T12:26:33.811Z","updated_at":"2026-03-14T18:09:38.879Z","registry_url":"https://tracker.debian.org/pkg/ruby-hashdiff","install_command":"apt-get install ruby-hashdiff","documentation_url":"https://packages.debian.org/trixie/ruby-hashdiff","metadata":{"component":"main","architecture":"all","priority":"optional","binary":"ruby-hashdiff","standards_version":"4.6.2","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake, ruby-rspec","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-12T12:26:35.730Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-hashdiff?arch=source\u0026distro=debian-13\u0026repository_url=https://packages.debian.org/trixie","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-hashdiff","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-hashdiff","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-hashdiff/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-hashdiff/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-hashdiff/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-hashdiff/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-hashdiff/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-hashdiff/codemeta","maintainers":[],"registry":{"name":"debian-13","url":"https://packages.debian.org/trixie","ecosystem":"debian","default":false,"packages_count":38024,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"debian","metadata":{"codename":"trixie"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:50.448Z","updated_at":"2026-04-27T18:20:39.853Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/namespaces"}}],"commits":{"id":19198,"full_name":"liufengyun/hashdiff","default_branch":"master","total_commits":156,"total_committers":29,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":5.379310344827586,"dds":0.5641025641025641,"past_year_total_commits":6,"past_year_total_committers":3,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":2.0,"past_year_dds":0.5,"last_synced_at":"2026-04-29T07:28:36.029Z","last_synced_commit":"d6ac7e74ee5b362e067e27312ec7545c7845ce45","created_at":"2023-03-07T11:40:23.150Z","updated_at":"2026-04-29T07:27:59.737Z","committers":[{"name":"liufengyun","email":"liufengyunchina@gmail.com","login":"liufengyun","count":68},{"name":"Krzysztof Rybka","email":"krzysztof.rybka@gmail.com","login":"krzysiek1507","count":17},{"name":"Stephen G","email":"stephen@egroat.com","login":"stephengroat","count":13},{"name":"Kevin Dew","email":"kevindew@me.com","login":"kevindew","count":5},{"name":"Matt Powell","email":"mattonlife@icloud.com","login":"matpowel","count":5},{"name":"Yuya.Nishida","email":"yuya@j96.org","login":"nishidayuya","count":5},{"name":"Ravi Gadad","email":"ravi@renewfund.com","login":null,"count":4},{"name":"dfaust","email":"dfaust@whitepages.com","login":null,"count":4},{"name":"Jeff Felchner","email":"catchall+git@jefffelchner.com","login":"jfelchner","count":4},{"name":"MatzFan","email":"matzfan@mailinator.com","login":null,"count":3},{"name":"Joe Francis","email":"joe@lostapathy.com","login":"lostapathy","count":3},{"name":"Douglas Eichelberger","email":"dduugg@gmail.com","login":"dduugg","count":2},{"name":"Koichi ITO","email":"koic.ito@gmail.com","login":"koic","count":2},{"name":"Olle Jonsson","email":"olle.jonsson@gmail.com","login":"olleolleolle","count":2},{"name":"Peter Boling","email":"peter.boling@gmail.com","login":"pboling","count":2},{"name":"Robert Kiessling","email":"robert.kiessling.jr@gmail.com","login":"robkiessling","count":2},{"name":"ronco","email":"ronco@costite.com","login":"ronco","count":2},{"name":"yuuji.yaginuma","email":"yuuji.yaginuma@gmail.com","login":"y-yagi","count":2},{"name":"Akira Matsuda","email":"ronnie@dio.jp","login":"amatsuda","count":1},{"name":"Andreas Zuber","email":"zuber@puzzle.ch","login":"ZeroPointEnergy","count":1},{"name":"Eric Cohen","email":"eirc.eirc@gmail.com","login":"eirc","count":1},{"name":"Marek","email":"nospam.keram@gmail.com","login":"keram","count":1},{"name":"Michael Grosser","email":"michael@grosser.it","login":"grosser","count":1},{"name":"Stanisław Pitucha","email":"viraptor@gmail.com","login":"viraptor","count":1},{"name":"Thibaut Barrère","email":"thibaut.barrere@gmail.com","login":"thbar","count":1},{"name":"Ivan Nixon","email":"paulthomas100199@gmail.com","login":null,"count":1},{"name":"Vladimir Kochnev","email":"hashtable@yandex.ru","login":"marshall-lee","count":1},{"name":"cloakedcode","email":"alan@airpost.net","login":"cloakedcode","count":1},{"name":"moe","email":"moe@busyloop.net","login":"m-o-e","count":1}],"past_year_committers":[{"name":"Fengyun Liu","email":"fengyun.liu.cs@gmail.com","login":"liufengyun","count":3},{"name":"Robert Kiessling","email":"robert.kiessling.jr@gmail.com","login":"robkiessling","count":2},{"name":"Krzysztof Rybka","email":"krzysztof.rybka@gmail.com","login":"krzysiek1507","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-29T00:00:10.453Z","repositories_count":6222883,"commits_count":899833732,"contributors_count":34897260,"owners_count":1147458,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"liufengyun/hashdiff","html_url":"https://github.com/liufengyun/hashdiff","last_synced_at":"2026-04-15T07:30:31.251Z","status":"error","issues_count":40,"pull_requests_count":68,"avg_time_to_close_issue":9621593.103448275,"avg_time_to_close_pull_request":252679.46774193548,"issues_closed_count":29,"pull_requests_closed_count":62,"pull_request_authors_count":38,"issue_authors_count":35,"avg_comments_per_issue":3.925,"avg_comments_per_pull_request":1.8235294117647058,"merged_pull_requests_count":53,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":79259.0,"past_year_avg_time_to_close_pull_request":37505.0,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.6666666666666666,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"created_at":"2023-05-12T11:52:17.468Z","updated_at":"2026-04-15T07:30:31.251Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/liufengyun%2Fhashdiff/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":32,"CONTRIBUTOR":7,"COLLABORATOR":1},"pull_request_author_associations_count":{"CONTRIBUTOR":40,"NONE":16,"COLLABORATOR":10,"OWNER":2},"issue_authors":{"grosser":4,"wimrijnders":2,"vsethi":2,"ronco":1,"renaudpr":1,"rmehner":1,"jembezmamy":1,"jarosite":1,"Githraine":1,"zenati":1,"donaldali":1,"rellampec":1,"robkiessling":1,"jfelchner":1,"taufek":1,"nbarrientos":1,"marceloboeira":1,"tomstuart":1,"dweebo":1,"kwasimensah":1,"bf4":1,"krzysiek1507":1,"gegenelnet":1,"pboling":1,"MatzFan":1,"kotubhaskar":1,"topalovic":1,"rajatjindal":1,"dpetrovics":1,"stripedpumpkin":1,"rhacker":1,"gmgp":1,"dennisfaust":1,"cdenneen":1,"bastelfreak":1},"pull_request_authors":{"krzysiek1507":10,"nishidayuya":4,"stephengroat":4,"olleolleolle":4,"kevindew":3,"jfelchner":3,"MatzFan":3,"koic":3,"ravigadad":2,"dduugg":2,"liufengyun":2,"robkiessling":2,"dmitrytrager":1,"keram":1,"kgooble":1,"grumpit":1,"pboling":1,"y-yagi":1,"IvanNixon":1,"grey-stripe":1,"viraptor":1,"IvanVIII":1,"marshall-lee":1,"matpowel":1,"adriantoman":1,"amatsuda":1,"eirc":1,"lostapathy":1,"ZeroPointEnergy":1,"xiejiangzhi":1,"thbar":1,"tatsuyafw":1,"dennisfaust":1,"grosser":1,"m-o-e":1,"cloakedcode":1,"rajatjindal":1,"ronco":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-25T00:00:14.967Z","repositories_count":14386555,"issues_count":34396482,"pull_requests_count":112636650,"authors_count":11244842,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":2},"past_year_pull_request_author_associations_count":{"COLLABORATOR":2,"CONTRIBUTOR":1,"NONE":1},"past_year_issue_authors":{"gegenelnet":1,"robkiessling":1},"past_year_pull_request_authors":{"krzysiek1507":2,"robkiessling":2},"maintainers":[{"login":"krzysiek1507","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"},{"login":"liufengyun","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/liufengyun"}],"active_maintainers":[{"login":"krzysiek1507","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krzysiek1507"}]},"events":{"total":{"DeleteEvent":1,"PullRequestEvent":2,"ForkEvent":2,"IssuesEvent":4,"WatchEvent":46,"IssueCommentEvent":7,"PushEvent":5,"PullRequestReviewEvent":1,"CreateEvent":3},"last_year":{"DeleteEvent":1,"PullRequestEvent":2,"ForkEvent":1,"IssuesEvent":2,"WatchEvent":27,"IssueCommentEvent":3,"PushEvent":4,"PullRequestReviewEvent":1,"CreateEvent":2}},"keywords":[],"dependencies":[{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2024-01-31T18:03:39.348Z","updated_at":"2024-01-31T18:03:39.348Z","repository_link":"https://github.com/liufengyun/hashdiff/blob/master/Gemfile","dependencies":[{"id":15947850974,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"rubygems","filepath":"hashdiff.gemspec","sha":null,"kind":"manifest","created_at":"2024-01-31T18:03:39.407Z","updated_at":"2024-01-31T18:03:39.407Z","repository_link":"https://github.com/liufengyun/hashdiff/blob/master/hashdiff.gemspec","dependencies":[{"id":15947850977,"package_name":"bluecloth","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":15947851699,"package_name":"rspec","ecosystem":"rubygems","requirements":"~\u003e 3.5","direct":true,"kind":"development","optional":false},{"id":15947851700,"package_name":"rubocop","ecosystem":"rubygems","requirements":"\u003e= 1.52.1","direct":true,"kind":"development","optional":false},{"id":15947851701,"package_name":"rubocop-rspec","ecosystem":"rubygems","requirements":"\u003e 1.16.0","direct":true,"kind":"development","optional":false},{"id":15947851702,"package_name":"yard","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci.yml","sha":null,"kind":"manifest","created_at":"2024-06-02T21:26:23.621Z","updated_at":"2024-06-02T21:26:23.621Z","repository_link":"https://github.com/liufengyun/hashdiff/blob/master/.github/workflows/ci.yml","dependencies":[{"id":18371949331,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":18371949332,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]}],"score":32.178159449907504,"created_at":"2024-12-15T21:38:07.239Z","updated_at":"2026-04-30T19:30:19.588Z","avatar_url":"https://github.com/liufengyun.png","language":"Ruby","monthly_downloads":0,"readme":"# Hashdiff [![Build Status](https://github.com/liufengyun/hashdiff/workflows/ci/badge.svg)](https://github.com/liufengyun/hashdiff/actions?query=workflow%3Aci) [![Gem Version](https://badge.fury.io/rb/hashdiff.svg)](http://badge.fury.io/rb/hashdiff)\n\nHashdiff is a ruby library to compute the smallest difference between two hashes.\n\nIt also supports comparing two arrays.\n\nHashdiff does not monkey-patch any existing class. All features are contained inside the `Hashdiff` module.\n\n**Docs**: [Documentation](http://rubydoc.info/gems/hashdiff)\n\n\n__WARNING__: Don't use the library for comparing large arrays, say ~10K (see #49).\n\n## Why Hashdiff?\n\nGiven two Hashes A and B, sometimes you face the question: what's the smallest modification that can be made to change A into B?\n\nAn algorithm that responds to this question has to do following:\n\n* Generate a list of additions, deletions and changes, so that `A + ChangeSet = B` and `B - ChangeSet = A`.\n* Compute recursively -- Arrays and Hashes may be nested arbitrarily in A or B.\n* Compute the smallest change -- it should recognize similar child Hashes or child Arrays between A and B.\n\nHashdiff answers the question above using an opinionated approach:\n\n* Hash can be represented as a list of (dot-syntax-path, value) pairs. For example, `{a:[{c:2}]}` can be represented as `[\"a[0].c\", 2]`.\n* The change set can be represented using the dot-syntax representation. For example, `[['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]]`.\n* It compares Arrays using the [LCS(longest common subsequence)](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem) algorithm.\n* It recognizes similar Hashes in an Array using a similarity value (0 \u003c similarity \u003c= 1).\n\n## Usage\n\nTo use the gem, add the following to your Gemfile:\n\n```Ruby\ngem 'hashdiff'\n```\n\n## Quick Start\n\n### Diff\n\nTwo simple hashes:\n\n```ruby\na = {a:3, b:2}\nb = {}\n\ndiff = Hashdiff.diff(a, b)\ndiff.should == [['-', 'a', 3], ['-', 'b', 2]]\n```\n\nMore complex hashes:\n\n```ruby\na = {a:{x:2, y:3, z:4}, b:{x:3, z:45}}\nb = {a:{y:3}, b:{y:3, z:30}}\n\ndiff = Hashdiff.diff(a, b)\ndiff.should == [['-', 'a.x', 2], ['-', 'a.z', 4], ['-', 'b.x', 3], ['~', 'b.z', 45, 30], ['+', 'b.y', 3]]\n```\n\nArrays in hashes:\n\n```ruby\na = {a:[{x:2, y:3, z:4}, {x:11, y:22, z:33}], b:{x:3, z:45}}\nb = {a:[{y:3}, {x:11, z:33}], b:{y:22}}\n\ndiff = Hashdiff.best_diff(a, b)\ndiff.should == [['-', 'a[0].x', 2], ['-', 'a[0].z', 4], ['-', 'a[1].y', 22], ['-', 'b.x', 3], ['-', 'b.z', 45], ['+', 'b.y', 22]]\n```\n\n### Patch\n\npatch example:\n\n```ruby\na = {'a' =\u003e 3}\nb = {'a' =\u003e {'a1' =\u003e 1, 'a2' =\u003e 2}}\n\ndiff = Hashdiff.diff(a, b)\nHashdiff.patch!(a, diff).should == b\n```\n\nunpatch example:\n\n```ruby\na = [{'a' =\u003e 1, 'b' =\u003e 2, 'c' =\u003e 3, 'd' =\u003e 4, 'e' =\u003e 5}, {'x' =\u003e 5, 'y' =\u003e 6, 'z' =\u003e 3}, 1]\nb = [1, {'a' =\u003e 1, 'b' =\u003e 2, 'c' =\u003e 3, 'e' =\u003e 5}]\n\ndiff = Hashdiff.diff(a, b) # diff two array is OK\nHashdiff.unpatch!(b, diff).should == a\n```\n\n### Options\n\nThe following options are available: `:delimiter`, `:similarity`, `:strict`, `:ignore_keys`,\n`:indifferent`, `:numeric_tolerance`, `:strip`, `:case_insensitive`, `:array_path`, \n`:use_lcs`, and `:preserve_key_order`\n\n#### `:delimiter`\n\nYou can specify `:delimiter` to be something other than the default dot. For example:\n\n```ruby\na = {a:{x:2, y:3, z:4}, b:{x:3, z:45}}\nb = {a:{y:3}, b:{y:3, z:30}}\n\ndiff = Hashdiff.diff(a, b, delimiter: '\\t')\ndiff.should == [['-', 'a\\tx', 2], ['-', 'a\\tz', 4], ['-', 'b\\tx', 3], ['~', 'b\\tz', 45, 30], ['+', 'b\\ty', 3]]\n```\n\n#### `:similarity`\n\nIn cases where you have similar hash objects in arrays, you can pass a custom value for `:similarity` instead of the default `0.8`.  This is interpreted as a ratio of similarity (default is 80% similar, whereas `:similarity =\u003e 0.5` would look for at least a 50% similarity).\n\n#### `:strict`\n\nThe `:strict` option, which defaults to `true`, specifies whether numeric types are compared on type as well as value.  By default, an Integer will never be equal to a Float (e.g. 4 != 4.0).  Setting `:strict` to false makes the comparison looser (e.g. 4 == 4.0).\n\n#### `:ignore_keys`\n\nThe `:ignore_keys` option allows you to specify one or more keys to ignore, which defaults to `[]` (none). Ignored keys are ignored at all levels in both hashes. For example:\n\n```ruby\na = { a: 4, g: 0, b: { a: 5, c: 6, e: 1 }       }\nb = {             b: { a: 7, c: 3, f: 1 }, d: 8 }\ndiff = Hashdiff.diff(a, b, ignore_keys: %i[a f])\ndiff.should == [['-', 'g', 0], ['-', 'b.e', 1], ['~', 'b.c', 6, 3], ['+', 'd', 8]]\n```\nIf you wish instead to ignore keys at a particlar level you should\nuse a [custom comparison method](https://github.com/liufengyun/hashdiff#specifying-a-custom-comparison-method) instead. For example to diff only at the 2nd level of both hashes:\n\n```ruby\na = { a: 4, g: 0, b: { a: 5, c: 6, e: 1 }       }\nb = {             b: { a: 7, c: 3, f: 1 }, d: 8 }\ndiff = Hashdiff.diff(a, b) do |path, _e, _a|\n  arr = path.split('.')\n  true if %w[a f].include?(arr.last) \u0026\u0026 arr.size == 2 # note '.' is the default delimiter\nend\ndiff.should == [['-', 'a', 4], ['-', 'g', 0], ['-', 'b.e', 1], ['~', 'b.c', 6, 3], ['+', 'd', 8]]\n```\n\n#### `:indifferent`\n\nThe `:indifferent` option, which defaults to `false`, specifies whether to treat hash keys indifferently.  Setting `:indifferent` to true has the effect of ignoring differences between symbol keys (ie. {a: 1} ~= {'a' =\u003e 1})\n\n#### `:numeric_tolerance`\n\nThe :numeric_tolerance option allows for a small numeric tolerance.\n\n```ruby\na = {x:5, y:3.75, z:7}\nb = {x:6, y:3.76, z:7}\n\ndiff = Hashdiff.diff(a, b, numeric_tolerance: 0.1)\ndiff.should == [[\"~\", \"x\", 5, 6]]\n```\n\n#### `:strip`\n\nThe :strip option strips all strings before comparing.\n\n```ruby\na = {x:5, s:'foo '}\nb = {x:6, s:'foo'}\n\ndiff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, strip: true)\ndiff.should == [[\"~\", \"x\", 5, 6]]\n```\n\n#### `:case_insensitive`\n\nThe :case_insensitive option makes string comparisons ignore case.\n\n```ruby\na = {x:5, s:'FooBar'}\nb = {x:6, s:'foobar'}\n\ndiff = Hashdiff.diff(a, b, numeric_tolerance: 0.1, case_insensitive: true)\ndiff.should == [[\"~\", \"x\", 5, 6]]\n```\n\n#### `:array_path`\n\nThe :array_path option represents the path of the diff in an array rather than\na string. This can be used to show differences in between hash key types and\nis useful for `patch!` when used on hashes without string keys.\n\n```ruby\na = {x:5}\nb = {'x'=\u003e6}\n\ndiff = Hashdiff.diff(a, b, array_path: true)\ndiff.should == [['-', [:x], 5], ['+', ['x'], 6]]\n```\n\nFor cases where there are arrays in paths their index will be added to the path.\n```ruby\na = {x:[0,1]}\nb = {x:[0,2]}\n\ndiff = Hashdiff.diff(a, b, array_path: true)\ndiff.should == [[\"-\", [:x, 1], 1], [\"+\", [:x, 1], 2]]\n```\n\nThis shouldn't cause problems if you are comparing an array with a hash:\n\n```ruby\na = {x:{0=\u003e1}}\nb = {x:[1]}\n\ndiff = Hashdiff.diff(a, b, array_path: true)\ndiff.should == [[\"~\", [:x], {0=\u003e1}, [1]]]\n```\n\n#### `:use_lcs`\n\nThe :use_lcs option is used to specify whether a\n[Longest common subsequence](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)\n(LCS) algorithm is used to determine differences in arrays. This defaults to\n`true` but can be changed to `false` for significantly faster array comparisons\n(O(n) complexity rather than O(n\u003csup\u003e2\u003c/sup\u003e) for LCS).\n\nWhen :use_lcs is false the results of array comparisons have a tendency to\nshow changes at indexes rather than additions and subtractions when :use_lcs is\ntrue.\n\nNote, currently the :similarity option has no effect when :use_lcs is false.\n\n```ruby\na = {x: [0, 1, 2]}\nb = {x: [0, 2, 2, 3]}\n\ndiff = Hashdiff.diff(a, b, use_lcs: false)\ndiff.should == [[\"~\", \"x[1]\", 1, 2], [\"+\", \"x[3]\", 3]]\n```\n\n#### `:preserve_key_order`\n\nBy default, the change set is ordered by operation type: deletions (-) first, then updates (~), and finally additions (+). \nWithin each operation group, keys are sorted alphabetically:\n\n```ruby\na = {d: 1, c: 1,       a: 1}\nb = {d: 2,       b: 2, a: 2}\n\ndiff = Hashdiff.diff(a, b)\ndiff.should == [[\"-\", \"c\", 1], [\"~\", \"a\", 1, 2], [\"~\", \"d\", 1, 2], [\"+\", \"b\", 2]]\n```\n\nSetting :preserve_key_order to true processes keys in the order they appear in the first hash.\nKeys that only exist in the second hash are appended in their original order:\n\n```ruby\na = {d: 1, c: 1,       a: 1}\nb = {d: 2,       b: 2, a: 2}\n\ndiff = Hashdiff.diff(a, b, preserve_key_order: true)\ndiff.should == [[\"~\", \"d\", 1, 2], [\"-\", \"c\", 1], [\"~\", \"a\", 1, 2], [\"+\", \"b\", 2]]\n```\n\n#### Specifying a custom comparison method\n\nIt's possible to specify how the values of a key should be compared.\n\n```ruby\na = {a:'car', b:'boat', c:'plane'}\nb = {a:'bus', b:'truck', c:' plan'}\n\ndiff = Hashdiff.diff(a, b) do |path, obj1, obj2|\n  case path\n  when  /a|b|c/\n    obj1.length == obj2.length\n  end\nend\n\ndiff.should == [['~', 'b', 'boat', 'truck']]\n```\n\nThe yielded params of the comparison block is `|path, obj1, obj2|`, in which path is the key (or delimited compound key) to the value being compared. When comparing elements in array, the path is with the format `array[*]`. For example:\n\n```ruby\na = {a:'car', b:['boat', 'plane'] }\nb = {a:'bus', b:['truck', ' plan'] }\n\ndiff = Hashdiff.diff(a, b) do |path, obj1, obj2|\n  case path\n  when 'b[*]'\n    obj1.length == obj2.length\n  end\nend\n\ndiff.should == [[\"~\", \"a\", \"car\", \"bus\"], [\"~\", \"b[1]\", \"plane\", \" plan\"], [\"-\", \"b[0]\", \"boat\"], [\"+\", \"b[0]\", \"truck\"]]\n```\n\nWhen a comparison block is given, it'll be given priority over other specified options. If the block returns value other than `true` or `false`, then the two values will be compared with other specified options.\n\nWhen used in conjunction with the `array_path` option, the path passed in as an argument will be an array. When determining the ordering of an array a key of `\"*\"` will be used in place of the `key[*]` field. It is possible, if you have hashes with integer or `\"*\"` keys, to have problems distinguishing between arrays and hashes - although this shouldn't be an issue unless your data is very difficult to predict and/or your custom rules are very specific.\n\n#### Sorting arrays before comparison\n\nAn order difference alone between two arrays can create too many diffs to be useful. Consider sorting them prior to diffing.\n\n```ruby\na = {a:'car', b:['boat', 'plane'] }\nb = {a:'car', b:['plane', 'boat'] }\n\nHashdiff.diff(a, b).should == [[\"+\", \"b[0]\", \"plane\"], [\"-\", \"b[2]\", \"plane\"]]\n\nb[:b].sort!\n\nHashdiff.diff(a, b).should == []\n```\n\n## Maintainers\n\n- Krzysztof Rybka ([@krzysiek1507](https://github.com/krzysiek1507))\n- Fengyun Liu ([@liufengyun](https://github.com/liufengyun))\n\n## License\n\nHashdiff is distributed under the MIT-LICENSE.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["rubygem","activejob","activerecord","mvc","crash-reporting","static-code-analysis","code-formatter","rubocop","rspec","rack"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/190","html_url":"https://ruby.ecosyste.ms/projects/190"}