في Java ، يمكن استخدام خوارزمية Hashcode لحساب قيمة التجزئة للسلسلة. اليوم ، سألني أحد الأصدقاء فجأة عما إذا كان بإمكاني حساب رمز Hashcode في JS ، والشرط هو نفس نتيجة حساب Hashcode لـ Java.
لم أفهم أبدًا خوارزمية ترميز جافا حتى الآن ، لكن ربما لن يكون الأمر صعبًا للغاية. لذلك كتبت هذا الرمز في جافا للاختبار:
النتيجة الجري: 899755
اضغط على مفتاح CTRL وانقر فوق اسم طريقة HashCode للمتابعة والنظر في خوارزمية. لقد وجدت أنه عبارة عن بعض جمل رمز بسيطة ، كما هو موضح أدناه:
نسخة الكود كما يلي:
Hashcode int العامة () {
int h = التجزئة ؛
if (h == 0) {
int OFF = الإزاحة ؛
char val [] = value ؛
int len = count ؛
لـ (int i = 0 ؛ i <len ؛ i ++) {
H = 31*H+Val [Off ++] ؛
}
التجزئة = ح ؛
}
العودة ح.
}
الآن ، يجب أن يكون على ما يرام إذا كنت ببساطة تنقله إلى JS. لذلك كتبت رمز JS التالي:
نسخة الكود كما يلي:
<script type = "text/javaScript">
دالة hashcode (str) {
var H = 0 ، Off = 0 ؛
var len = str.length ؛
لـ (var i = 0 ؛ i <len ؛ i ++) {
h = 31 * h+str.charcodeat (Off ++) ؛
}
العودة ح.
}
تنبيه (hashcode ('Shenyang')) ؛
</script>
النتيجة الجري: 899755
حسنًا ، نفس نتيجة حساب Java. اعتقدت أن هذا سيتم ، ثم فكرت في العثور على سلسلة لاختبارها:
"Shenyang ، Shenyang" ، نتيجة الركض في Java هي: 1062711668 ، لكنها تصبح: 26832515444 في JS.
أنا فظيع للغاية ، هناك مشكلة في محاولة واحدة فقط! بعد التفكير للحظة ، أدركت فجأة أن طول Int في Java يبدو أن حوالي 2.1 مليار ، ولا يوجد مثل هذا القيود في JS. يجب أن تكون المشكلة هنا ، لذلك قمت ببعض التعديلات على الطريقة السابقة:
نسخة الكود كما يلي:
<script>
دالة hashcode (str) {
var H = 0 ، Off = 0 ؛
var len = str.length ؛
لـ (var i = 0 ؛ i <len ؛ i ++) {
h = 31 * h+str.charcodeat (Off ++) ؛
}
var t = -2147483648*2 ؛
بينما (H> 2147483647) {
H+= T.
}
العودة ح.
}
تنبيه (hashcode ('Shenyang Shenyang'))) ؛ </script>
اختبار مرة أخرى! نعم! تم الانتهاء من المهمة. لا يوجد محتوى تقني ، ملخص صغير
تم تحديثه في 2013-02-19 ، ما أعلاه غير فعال نسبيًا وسيتم تبديده عندما يكون المحتوى طويلًا جدًا. الرمز التالي هو الرمز الأمثل:
نسخة الكود كما يلي:
<script>
دالة hashcode (str) {
var H = 0 ؛
var len = str.length ؛
var t = 2147483648 ؛
لـ (var i = 0 ؛ i <len ؛ i ++) {
h = 31 * h + str.charcodeat (i) ؛
إذا (H> 2147483647) H ٪ = t ؛ // java int verflains لأخذ الوحدة النمطية
}
/ * var t = -2147483648 * 2 ؛
بينما (H> 2147483647) {
H += T.
}*/
العودة ح.
}
التنبيه (HashCode ('c# كيفية تنفيذ مؤشرات الترابط n في وقت واحد في نفس الوقت ، يتم تنفيذ الباقي في قائمة الانتظار')) ؛ // 1107373715
</script>