I assume that file names don't contain newlines or initial or trailing whitespace (the SFV format doesn't support those anyway) and that you have GNU utilities (non-embedded Linux, Cygwin).
First generate a mapping from file names to inode numbers, and sort it by inode numbers.
tmpdir=$(mktemp -d)
find .* * -xdev -name .. -prune -o -type f -printf '%i %p\n' |
sort -k 1n > "$tmpdir/inodes.txt"
Generate a checksum file for the first file with each inode number.
<"$tmpdir/inodes.txt" awk '$1 != previous {previous = $1; sub(/^[0-9]+ /,""); print}' |
xargs cfv -C - >"$tmpdir/1.cfv"
Now complete the checksum file taking advantage of the hard links. I don't know if cfv prints the files in the order in which they are passed on the command line, if it does you can save memory at this step because the temporary CFV file and the inode file will be in ordered in the same way.
awk '
FNR==1 {
match($0, / +[[:alnum:]] *$/);
cksums[substr($0, 1, RSTART-1)] = substr($0, RSTART);
next
}
{ inode = $1; sub(/^[0-9]+ /, ""); }
previous != inode { cksum = cksums[$0] }
{ print $0, cksum }
' "$tmpdir/1.cfv" "$tmpdir/inodes.txt" >full.cfv
You can then remove the temporary files.
Warning: untested code.