Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace CRC-32 with SHA-256 in our macro target #1047

Merged
merged 3 commits into from
Apr 3, 2025

Conversation

grynspan
Copy link
Contributor

@grynspan grynspan commented Apr 1, 2025

This PR replaces CRC-32 with SHA-256 in our macro target.

We currently use CRC-32 to disambiguate test functions that would otherwise generate identical derived symbol names (using context.makeUniqueName().) By replacing it with the first 64 bits of a SHA-256 hash, we reduce the odds of a collision.

We also currently use a 128-bit random number as a unique ID for exit tests during macro expansion (which is as unique as it gets, but unstable.) Replacing this random number with half of a SHA-256 hash allows us to generate stable IDs (that are still statistically unique) which can help when debugging an exit test and may also improve cache quality for tools (e.g. an IDE's symbol cache.)

Because there is no SHA-256 implementation available in the Swift standard library or other components we can reliably link to in the macro target, I've borrowed the implementation of SHA-256 in swift-tools-support-core. The original version is here.

Checklist:

  • Code and documentation should follow the style of the Style Guide.
  • If public symbols are renamed or modified, DocC references should be updated.

@grynspan grynspan added enhancement New feature or request exit-tests ☠️ Work related to exit tests macros 🔭 Related to Swift macros such as @Test or #expect labels Apr 1, 2025
@grynspan grynspan added this to the Swift 6.2 milestone Apr 1, 2025
@grynspan grynspan self-assigned this Apr 1, 2025
@grynspan
Copy link
Contributor Author

grynspan commented Apr 1, 2025

@swift-ci test

4 similar comments
@grynspan
Copy link
Contributor Author

grynspan commented Apr 1, 2025

@swift-ci test

@grynspan
Copy link
Contributor Author

grynspan commented Apr 1, 2025

@swift-ci test

@grynspan
Copy link
Contributor Author

grynspan commented Apr 1, 2025

@swift-ci test

@grynspan
Copy link
Contributor Author

grynspan commented Apr 2, 2025

@swift-ci test

@grynspan grynspan changed the title [WIP, DNM] Use a hash function in the macro target that's stronger than crc32() (when available from the OS) Replace CRC-32 with SHA-256 in our macro target Apr 2, 2025
@grynspan grynspan added the tools integration Integration of swift-testing into tools/IDEs label Apr 2, 2025
@grynspan
Copy link
Contributor Author

grynspan commented Apr 2, 2025

@swift-ci test

This PR replaces CRC-32 with SHA-256 in our macro target.

We currently use CRC-32 to disambiguate test functions that would otherwise generate identical derived symbol names (using `context.makeUniqueName()`.) By replacing it with the first 64 bits of a SHA-256 hash, we reduce the odds of a collision.

We also currently use a 128-bit random number as a unique ID for exit tests during macro expansion (which is as unique as it gets, but unstable.) Replacing this random number with half of a SHA-256 hash allows us to generate _stable_ IDs (that are still statistically unique) which can help when debugging an exit test and may also improve cache quality for tools (e.g. an IDE's symbol cache.)

Because there is no SHA-256 implementation available in the Swift standard library or other components we can reliably link to in the macro target, I've borrowed the implementation of SHA-256 in swift-tools-support-core. The original version is [here](https://github.com/swiftlang/swift-tools-support-core/blob/main/Sources/TSCBasic/HashAlgorithms.swift).
@grynspan grynspan force-pushed the jgrynspan/hash-stronger-than-crc32 branch from 34e2a16 to fd3c76f Compare April 2, 2025 15:10
@grynspan
Copy link
Contributor Author

grynspan commented Apr 2, 2025

@swift-ci test

@grynspan grynspan marked this pull request as ready for review April 2, 2025 15:10
@grynspan
Copy link
Contributor Author

grynspan commented Apr 2, 2025

@swift-ci test

@grynspan
Copy link
Contributor Author

grynspan commented Apr 3, 2025

@swift-ci test

@grynspan grynspan merged commit f770543 into main Apr 3, 2025
3 checks passed
@grynspan grynspan deleted the jgrynspan/hash-stronger-than-crc32 branch April 3, 2025 17:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request exit-tests ☠️ Work related to exit tests macros 🔭 Related to Swift macros such as @Test or #expect tools integration Integration of swift-testing into tools/IDEs
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants