Ruby で長い文字列から衝突しない短い文字列を作成しようとしています。これを行う最善の方法は何ですか?Base64はMD5ハッシュをエンコードしますか?
これは使用例です:
loop do
key = short_hash("#{user_id}-#{timestamp}")
break if $redis.setnx(key, "0")
end
キーを長くしたくありません。
あなたが持っている例と同様に、これにはSHAが持っていることがよくあります。一意であるとは限りませんが、通常、ほとんどの目的には十分です。
require 'digest/sha1'
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}")
ruby UUID gemも別のオプションです。
しかし、特定のケースでは、redis を使用しているため、redis INCRコマンドを使用しないのはなぜですか? 次に、少なくともデータベース内で一意性を保証できます。例えば:
unique_key = $redis.incr('users:next')
ハッシュ関数を使用して、衝突する可能性が低い短い文字列を作成できます。ただし、ピジョンホールの原則 により、同じ値にハッシュされる 2 つの長い文字列を見つけることができることが保証されます。
真に一意の値を生成するには、連続した識別番号を割り当てる必要がある場合があります。ただし、これには、どの識別番号がどの入力文字列に関連付けられているかを追跡する必要もあります。