2012-06-11 28 views
13

üretir. Çevrimiçi alışverişlerde onay kodları olarak kullanılmak üzere kısa, benzersiz bir alfasayısal değer oluşturmak istiyorum. Ben https://github.com/broofa/node-uuid içine bakıyorum ama onların uuids çok uzun ve ben onları 8 karakter uzunluğunda olmak istiyorum. Bunu başarabilmemin en iyi yolu nedir?Nodejs, kısa bir benzersiz alfanümerik

+4

Benzersiz ve kısa onun sayfada Bakış Tek bir kaynağa sahip olduklarını garanti etmedikçe veya iki sunucu aynı dizeleri üretmeyecek şekilde bazı kilitleme yöntemlerine sahip olmadıkça el ele gitmeyin. – Brad

+1

Bir hash işlevini kullanırsanız, karma sonucunun mümkün olan en kısa alt dizesini belirlemeye çalışabilirsiniz, tıpkı işlem karmalarını kısaltmak gibi. – TheHippo

cevap

32

10/23/15: Ayrıca aşağıdaki karma çözümlerine de bakınız!

URL kısaltıcı modelinden ödünç ve böyle bir şey yapabilirsiniz: Bu sadece gerçekten olduğunu

function(uniqueIndex) { 
    return uniqueIndex.toString(36); 
} 

Not:

(100000000000).toString(36); 
// produces 19xtf1ts 

(200000000000).toString(36); 
// produces 2jvmu3nk 

Sadece bu benzersiz tutmak için sayıyı artırmak "tek örnek" hizmetleri için, siparişin verildiği şekilde belirli bir miktar öngörülebilirlikten sakınmak için yararlıdır (temel artışla). Bir dizi uygulama/DB örneğinde gerçekten benzersiz bir değere ihtiyacınız varsa, bazı yorumlar için gerçekten tam özellikli bir seçenek düşünmelisiniz.

+2

Bahşiş için teşekkürler. Sağladığınız şeye benzer bir şey kullanarak sona erdi: var now = new Date(); Math.floor (Math.random() * 10) + parseInt (now.getTime()). ToString (36) .toUpperCase() – teggy

+1

"ParseInt" ne ekler? (100000000000) .toString (36) 'da değil mi? – JohnnyHK

+0

Evet öyle olurdu. Sadece neler olduğunu açıklamak istedim. –

33

Bu konuda biraz geç ama bu senaryo için karmaşıklar çok iyi çalışır gibi görünüyor.

https://github.com/ivanakimov/hashids.node.js

hashids (Hash kimlikleri) oluşturur işaretsiz tamsayılar

var Hashids = require('hashids'), 
hashids = new Hashids('this is my salt'); 

var hash = hashids.encrypt(12345); 
// hash is now 'ryBo' 

var numbers = hashids.decrypt('ryBo'); 
// numbers is now [ 12345 ] 

sen ~ Yapabileceğin 8 karakter hedeflemek istiyorsanız kısa, eşsiz, decryptable karmaları şu o en az 8 karaktere çağrı yapar.

hashids = new Hashids("this is my salt", 8); 

sonra bu:

hash = hashids.encrypt(1); 
// hash is now 'b9iLXiAa' 

kabul cevap tahmin edilebilir/öngörülebilir olacağını, bu çözüm eşsiz ve öngörülemez olması gerekir.

+0

Biçimlendirmelerde 1.0.0 olarak güncellemeler. Bazı genel işlevler daha uygun olacak şekilde yeniden adlandırılır: ** İşlev şifrelemesi() encode() **, olarak değiştirilmiştir. ** İşlev şifresi() kod çözme() **, olarak değiştirilmiştir ** İşlev encryptHex() encodeHex olarak değiştirilmiştir() **, ** Fonksiyon şifresiHex() decodeHex() olarak değiştirildi. ** –

+0

Bağlantı bozuk. –

+0

İşte [yeni bağlantı] (https://github.com/ivanakimov/hashids.js). – cowgill

0

ShortId modülünü (https://www.npmjs.com/package/shortid) yükleyin. Varsayılan olarak, shortid 7-14 url-dostu karakterleri üretir: A-Z, a-z, 0-9, _- ancak değiştirebilirsiniz - ve eğer isterseniz başka karakterlerle _. Artık veritabanına kaydedildiklerinde bu kısa nesneye nesnelere yapışmanız gerekiyor.

var shortId = require('shortid'); 
var PurchaseConfirmationSchema = mongoose.Schema({ 
    /* _id will be added automatically by mongoose */ 
    shortId: {type: String, unique: true, default: shortId.generate}, /* WE SHOULD ADD THIS */ 
    name: {type: String}, 
    address: {type: String} 
}); 

Zaten buraya kendime benzer soruyu yanıtladı: Bu amaçla

Shorten ObjectId in node.js and mongoose

+1

Merhaba, kısa bir süre sonra sunucu yeniden başlatıldıktan sonra benzersiz bir dize verecektir? –

+1

Ama tam olarak 64 karakterden oluşan bir sözlük gerektiriyor, bu yüzden değiştirseniz bile alfanümerik olmayacak - ve _. –

0

bunu yapabilecek bir modül yazdım iyi yolu böyle Şemanıza onları sopa etmektir Bunu ve daha fazlasını yapın.id-shorter

0

Benzersiz URL'ye ilişkili her çevrimiçi satın alma, sen veritabanı bağlantısı gerektirmeyen simple-short paketinin arka uç, ne de web servislerini kullanabilen EĞER:

var shorten=require('simple-short'); 

shorten.conf({length:8}); // Default is 4. 

code1=shorten('http://store.com/purchase1'); 
code2=shorten('http://store.com/purchase2'); 
//.. so on