2011-02-17 28 views
6

Ruby'de uzun dizelerden kısa çarpışmayan dizeler oluşturmaya çalışıyorum. Bunu yapmanın en iyi yolu nedir? Base64 bir MD5 hash kodlamak?Daha uzun bir dizeden kısa bir karma dizesi oluşturmanın en iyi yolu nedir?

loop do 
    key = short_hash("#{user_id}-#{timestamp}") 
    break if $redis.setnx(key, "0") 
end 

Ben anahtar çok uzun istemiyorum:

Bu

kullanıldığı durumdur.

+0

Bu sitede, benzer konular hakkında bir sürü soru var. Karmaşık konuları aramayı deneyin. İşte bir tane: http://stackoverflow.com/questions/4066601/developing-a-url-shortener/4066615#4066615 –

+1

@Sugerman: Bu soru Python'da. –

+2

Bu (ve diğer) iş parçacıklarındaki yanıttan ne toplayabiliyorsanız, bunu okumanın "en iyi yolun" dili agnostik olmasıdır. Önce karma algoritmanızı seçin ve dile özgü uygulama hakkında endişelenin. –

cevap

4

Genellikle SHA'nın sahip olduğunuz örneğe benzer şekilde kullanıyorum. Benzersiz olması garanti, ancak çoğu amaçlar için yeterli genellikle iyidir değil:

ruby UUID gem
require 'digest/sha1' 
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}") 

başka bir seçenektir.

Fakat özel durumunuzda redis kullandığınız için, neden redis INCR komutunu kullanıyorsunuz? Daha sonra, en azından veritabanınızda benzersizliği garanti edebilirsiniz. Örneğin,

unique_key = $redis.incr('users:next') 
+0

Hmm 'incr' kullanmayı düşünüyordum, ama unique_key için bir değer kaydetmem gerekiyor ... Sanırım yapabilirim 'uid = $ r.incr (' uids '); $ r.set (kullanıcı değeri, değer) ' –

+0

Bu yüzden 'incr' ile devam ettim - ama asıl soruda olduğu gibi,' Digest :: SHA1.hexdigest'den daha kısa bir karması olmasını umuyordum. Sanırım base64 kodlamasını kullanabilirim ... –

4

Hata kodu muhtemelen çarpışacak kısa dizeler oluşturmak için karma işlevini kullanabilirsiniz. Bununla birlikte, Pigeonhole principle, garanti eder, aynı değere hash olacak iki tane daha uzun dizi bulabileceksiniz.

Gerçekten benzersiz değerler üretmek için sıralı bir kimlik numarası atamanız gerekebilir. Ancak bu, hangi giriş dizisiyle ilişkilendirdiğiniz kimlik numarasını takip etmenizi gerektirir.

+0

Maalesef, çarpışmaları kontrol edip yeniden deneneceğimi söylemeyi unuttum. Sadece "yeniden denemeler" den mümkün olduğunca kaçınmak istiyorum. –

İlgili konular