Merge pull request 'fix(migrate-wiki): 正推比對涵蓋兩代頁名規則' (#49) from fix/migrate-two-hash-generations into develop

Reviewed-on: #49
This commit was merged in pull request #49.
This commit is contained in:
2026-09-02 04:18:42 +00:00
+12 -3
View File
@@ -66,15 +66,21 @@ while [ "$#" -gt 0 ]; do
esac esac
done done
old_hash() { # 舊演算法:SHA-1 前 8 碼大寫;首碼落在 0-9ABC 就改成 H 加前 7 碼 old_hash() { # 舊演算法:一個候選鍵可能對到兩種舊頁名,兩種都印出來,一行一個
# 這裡刻意印兩種,因為頁名規則改過兩次,兩代的頁至今並存:
# 第一代 只取 SHA-1 前 8 碼大寫。
# 第二代 在第一代之上,首碼落在 0-9ABC 就改成 H 加前 7 碼。
# 只算第二代的話,第一代那些首碼落在 0-9ABC 的頁一律配不到,會被誤判成孤兒
# 留在原地。實例:同一個鍵在第一代是 1C516D85、第二代是 H1C516D8,兩張頁都在。
# 首碼落在 D、E、F 的鍵兩代同值,這時只印一行。
if command -v sha1sum >/dev/null 2>&1; then if command -v sha1sum >/dev/null 2>&1; then
raw=$(printf '%s' "$1" | sha1sum | awk '{print $1}') raw=$(printf '%s' "$1" | sha1sum | awk '{print $1}')
else else
raw=$(printf '%s' "$1" | shasum -a 1 | awk '{print $1}') raw=$(printf '%s' "$1" | shasum -a 1 | awk '{print $1}')
fi fi
h=$(printf '%s' "$raw" | cut -c1-8 | tr a-f A-F) h=$(printf '%s' "$raw" | cut -c1-8 | tr a-f A-F)
case "$h" in [0-9ABC]*) h="H$(printf '%s' "$h" | cut -c1-7)" ;; esac
printf '%s\n' "$h" printf '%s\n' "$h"
case "$h" in [0-9ABC]*) printf 'H%s\n' "$(printf '%s' "$h" | cut -c1-7)" ;; esac
} }
rc=0 rc=0
@@ -218,7 +224,10 @@ sort -u "$work/keys" > "$work/keys.uniq"
: > "$work/hashes" : > "$work/hashes"
while IFS= read -r k <&3; do while IFS= read -r k <&3; do
[ -n "$k" ] || continue [ -n "$k" ] || continue
printf '%s\t%s\n' "$(old_hash "$k")" "$k" >> "$work/hashes" # old_hash 一個鍵可能印兩行(兩代頁名規則),每一行都要能配得到同一個鍵
old_hash "$k" | while IFS= read -r h; do
printf '%s\t%s\n' "$h" "$k" >> "$work/hashes"
done
done 3< "$work/keys.uniq" done 3< "$work/keys.uniq"
# ---- 第三輪:正推配對 ---- # ---- 第三輪:正推配對 ----