Add seed parameter to entropy.sh

This commit is contained in:
Christian Semmler 2025-02-17 17:35:25 -07:00
parent 77b568b3e3
commit b1b2d36abc
2 changed files with 48 additions and 9 deletions

View File

@ -87,7 +87,10 @@ jobs:
- name: Generate Entropy - name: Generate Entropy
shell: bash shell: bash
run: | run: |
tools/entropy.sh # Get the first 8 characters of the SHA (enough for a decent seed)
SHA_PREFIX=$(echo "${{ github.sha }}" | cut -c 1-8)
tools/entropy.sh $((16#$SHA_PREFIX + ${{ matrix.instance }}))
- name: Build - name: Build
shell: cmd shell: cmd

View File

@ -3,29 +3,65 @@
# Output file # Output file
OUTPUT_FILE="entropy.h" OUTPUT_FILE="entropy.h"
# Function to generate a random CamelCase string of given length # Function to generate a CamelCase string of given length
generate_name() { generate_name() {
cat /dev/urandom | tr -dc 'a-z' | fold -w "$1" | head -n 1 | sed -E 's/(^|_)([a-z])/\U\2/g' local seed="$1"
local length="$2"
local char_count=0
local random_bytes=""
while [ "$char_count" -lt "$length" ]; do
random_bytes+=$(od -vAn -N4 -tu4 < /dev/urandom | tr -d '[:space:]')
char_count=$((char_count + 1))
done
# Use the provided seed for the random number generation. Crucially, re-seed bash's
# RANDOM for each name.
RANDOM="$seed"
local result=""
for ((i=0; i<length; i++)); do
# Get a pseudo-random number between 0 and 25 (inclusive)
local rand_index=$((RANDOM % 26))
# Convert to lowercase ASCII character (a=97)
local char_code=$((97 + rand_index))
# Append to the result string
result+=$(printf "\\$(printf '%o' "$char_code")")
done
echo "$result" | sed -E 's/(^|_)([a-z])/\U\2/g'
} }
# Parse command-line arguments
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <seed_number>"
exit 1
fi
SEED="$1"
# Initialize the random number generator with the seed
RANDOM="$SEED"
# Generate a random number of classes (between 1 and 10) # Generate a random number of classes (between 1 and 10)
NUM_CLASSES=$((RANDOM % 10 + 1)) NUM_CLASSES=$((RANDOM % 10 + 1))
> "$OUTPUT_FILE" # Clear or create the output file > "$OUTPUT_FILE" # Clear or create the output file
echo "// Seed: $SEED" > "$OUTPUT_FILE"
echo >> "$OUTPUT_FILE"
for ((i=0; i<NUM_CLASSES; i++)); do for ((i=0; i<NUM_CLASSES; i++)); do
CLASS_NAME="Class$(generate_name 6)" CLASS_NAME="Class$(generate_name "$((SEED + i * 100))" 6)"
echo "class $CLASS_NAME {" >> "$OUTPUT_FILE" echo "class $CLASS_NAME {" >> "$OUTPUT_FILE"
# Generate a random number of methods (between 1 and 10) # Generate a random number of methods (between 1 and 10)
NUM_METHODS=$((RANDOM % 10 + 1)) NUM_METHODS=$((RANDOM % 10 + 1))
for ((j=0; j<NUM_METHODS; j++)); do for ((j=0; j<NUM_METHODS; j++)); do
METHOD_NAME="Function$(generate_name 8)" METHOD_NAME="Function$(generate_name "$((SEED + i * 100 + j))" 8)"
echo "inline void $METHOD_NAME() {}" >> "$OUTPUT_FILE" echo -e "\tinline void $METHOD_NAME() {}" >> "$OUTPUT_FILE"
done done
echo "};" >> "$OUTPUT_FILE" echo "};" >> "$OUTPUT_FILE"
echo >> "$OUTPUT_FILE" # Add an empty line for readability echo >> "$OUTPUT_FILE"
done done
echo "Generated $NUM_CLASSES classes in $OUTPUT_FILE" echo "Generated $NUM_CLASSES classes in $OUTPUT_FILE"