2016-04-05 36 views
1

Bu php işlevini bir api için coldfusion işlevine dönüştürmem gerekiyor ve çok fazla şansım yok. Ben php veya coldfusion unpack eşdeğeri ile aşina değilim ve sadece bir tuğla duvara çarptı. PHP'nin Coldfusion paketini açın

function i32hash($str) { 
$h = 0; 
foreach (unpack('C*', $str) as &$p) { $h = (37 * $h + $p) % 4294967296; } 
return ($h - 2147483648); 
} 

Sonuç

('127.0.0.1:1935/vod/sample.mp4') i32hash olmalıdır = 565817233

bu ben birlikte çalışıyoruz ama onun çalışmıyor kodudur. "4.294967296E9 değerini bir tamsayıya dönüştüremiyorum çünkü bir tamsayıya sığamadığından" bir hata alıyorum. Bu modülde olur.

function i32hash(str) { 
    var h = 0; 

    // php unpack equivalent 
    str = toBinary(toBase64(str)); 

    for(p in str) { 
     h = (37 * h + p) % 4294967296; 
    } 

    return h-2147483648; 
}  

Yardımlarınız için teşekkürler.

Güncelleme cevap, ben, bir PHP adam değilim

function i32hash(str) { 
    var h = 0; 
    var strArray = charsetDecode(arguments.str, "us-ascii"); 

    for(var p in strArray) { 
     h = precisionEvaluate((37 * h + p)); 
     h = h.remainder(javacast("bigdecimal", 4294967296)); 
    } 

    return precisionEvaluate(h - 2147483648); 
} 
+0

(http [PHP paketten ve SHA1 için ColdFusion Eşdeğeri] Olası yinelenen: // stackoverflow. com/questions/32978130/coldfusion-eşdeğer-php-unpack-and-sha1) –

+0

Şimdiye kadar denediğiniz şeyi yayınlayabilir misiniz? Yazılı olduğu için, bu sorunun [konu dışı] (http://stackoverflow.com/help/on-topic) veya çok geniş olarak kapalı olması büyük olasılıktır. – Leigh

+0

Özgün sorumu @Leigh – renhack

cevap

3

aşağıdaki yorum @Leigh tarafından tedarik ama zihnimin unpack('C*',..) ASCII kodlaması, yani kullanarak dize kod çözme için tercüme gerektiğidir charsetDecode(theString, "us-ascii").

Ben bir tamsayı içine sığacak çünkü bir tamsayıya değer 4.294967296E9 dönüştürülemez geri" bir hata alıyorum. Ne yazık ki

, CF en modulus operator, sağ 32 bitlik tamsayı gerektirir . yan değeri 4294967296 maximum allowed for integers aşıyor Sen PrecisionEvaluate() işlev bir BigDecimal döndüren yerine BigDecimal kullanmanız gerekecektir ifade ilk yarısında üzerinde kullanın.:..

firstPart = precisionEvaluate((37 * h + p)); 

Sonra yerine BigDecimal.remainder() yöntemiyle modülüne edinin:

h = firstPart.remainder(javacast("bigdecimal", 4294967296)); 

Son olarak, sonuç döndürmek:

precisionEvaluate(h - 2147483648) 
+0

Thanks @Leigh'e bir kod ekledim. Tam ihtiyacım olan buydu. BigDecimal yoluna gittim ama bölenin de büyük bir olasılık olması gerektiğini farketmedim. Hassasiyetin bile varolduğunun farkında değildim. ;) Tekrar teşekkürler. Vaktin için minnettarım. Sadece bu çalışmaların her iki ambalajındaki eşdeğerini isteyen herkes için. 'charsetDecode (theString," ascii ") & toBinary (toBase64 (theString))' – renhack

+0

Yardım edebileceğimi sevindim :) Kesinlik hakkında hatırlamanız gereken bir şey var: Değerinizi BigDecimal'i korumak için tutarlı bir şekilde kullanmalısınız. Bir "BigDecimal değişkeni * dışında bir matematiksel işlemi uyguladığınız anda *," h = precisionEvaluate (h * 1) "yerine" h = h * 1 "gibi," h "geri dönüşür java.lang.Double'. Ah, (nispeten) tipsiz bir dilin sevinçleri ;-) – Leigh

+0

Oops, sadece bir yazım hatası fark ettim. Kodlama [us-ascii] olmalıdır (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html) - "ascii" değil. Cevap güncellendi. – Leigh