Score:1

มีฟังก์ชันอินเจกทีฟที่จับคู่ชุดจำนวนเต็มขนาดใหญ่กับชุดที่เล็กกว่าได้หรือไม่ในขณะที่ "รับรู้การชนกัน"

ธง in

พิจารณาสองชุด:

"ชุดใหญ่" ประกอบด้วยจำนวนเต็มทั้งหมดระหว่าง $0$ และ $2^{160}$ ครั้งเดียว

"ชุดเล็ก" ประกอบด้วยจำนวนเต็มทั้งหมดระหว่าง $0$ และ $2^{32}$ ครั้งเดียว

เนื่องจากจำนวนสมาชิกใน "ชุดใหญ่" มากกว่าสมาชิกใน "ชุดเล็ก" จึงไม่สามารถมีฟังก์ชันฉีดได้ $f(n_b) = n_s$ การจับคู่อินพุตใด ๆ ที่เป็นสมาชิกของ "ชุดใหญ่" $n_b$ ไปยังเอาต์พุตที่เป็นสมาชิกของ "ชุดเล็ก" $n_s$. ถ้าฟังก์ชั่นนั้น $f$ มีอยู่มันจะเป็นคำตอบของคำถาม

ด้วยเหตุผลในทางปฏิบัติ เราสันนิษฐานว่ายังคงสามารถสร้าง/อัลกอริทึมที่มีฟังก์ชันที่ใช้งานได้จริงได้ $f_p$ โดยที่ผลลัพธ์ของการป้อนเข้าทั้งหมด $f_p(n_b)$ เป็นสมาชิกของ "ชุดเล็ก" และแต่ละตัว $n_b$ ชี้ให้เห็นความแตกต่าง $n_s$.

หากขาดความเข้าใจเกี่ยวกับแนวคิดการเข้ารหัส ฉันจะเรียกคุณสมบัตินี้ว่า "collision-aware" เช่น. เพื่อดำเนินการก่อสร้างนี้โดยสมมติว่ามีความจุของขนาด $2^{256}$ (จำนวนเต็มที่ไม่มีเครื่องหมาย 256 บิต) มีฟังก์ชันหรือไม่ $f_p$ หรืออัลกอริทึมสำหรับใดๆ $n_b$ ส่งคืน "การชนกัน" ("การชนกันที่ทราบ") หรือสมาชิกที่แตกต่างกันของ $n_s$?

cn flag
ไม่ชัดเจนสำหรับฉันมากว่าคุณกำลังมองหาอะไร สิ่งที่คุณอธิบายในย่อหน้าที่สองของคุณแตกต่างจากฟังก์ชันฉีดอย่างไร
cn flag
"การชนกลับ" หมายถึงอะไร?
user10030 avatar
in flag
ฉันกำลังมองหาฟังก์ชันที่ card(domain) > card(codomain) แต่แต่ละหมายเลขที่ฉันใช้เป็นอินพุตในฟังก์ชันจากแผนที่โดเมนไปยังหมายเลขที่แตกต่างกันใน codomain จากความเข้าใจของฉัน สิ่งนี้จะเป็นไปได้ก็ต่อเมื่อ card(domain) >= card(codomain) ดังนั้น เนื่องจากเป็นไปไม่ได้ ฉันจะมีฟังก์ชันที่อนุญาตการแมปแบบนี้ได้หรือไม่ เช่น "ข้อผิดพลาด" หากพบการชนในครั้งแรก
cn flag
เป็นไปไม่ได้ใช่ แต่พฤติกรรมที่คุณต้องการคืออะไรกันแน่? ฟังก์ชันส่งคืนค่าจากโดเมนหรือสัญลักษณ์ข้อผิดพลาดหรือไม่
user10030 avatar
in flag
นี่คือสิ่งที่ฉันต้องการจริง ๆ : ทุก ๆ ครั้งฉันได้รับหมายเลขสุ่มจาก uint160 (เป็นบัญชี / ที่อยู่ Ethereum) และฉันต้องการฟังก์ชั่นที่จับคู่แต่ละที่อยู่อย่างชัดเจนกับช่องเฉพาะของรายการความยาว 2^32สมมติว่าฉันได้จัดสรรที่อยู่ 100 รายการแล้ว ตอนนี้ที่อยู่ #101 นั้นยาวมาก และช่องของมันก็เหมือนกับเช่น #91 ฉันต้องการทราบว่ามีการชนกันของสล็อตในขณะนี้ #101 ไม่ควรเขียนทับ #91 อย่างไรก็ตาม ฉันไม่สามารถเก็บที่อยู่ที่เก็บไว้ก่อนหน้านี้ทั้งหมดได้ ฉันมีช่องเสียบขนาดความจุเท่านั้นเช่น uin256.
cn flag
หากไม่มีข้อกำหนดเพิ่มเติม ฟังก์ชันจะกำหนดเป็น "ถ้า $x\leq2^{32}$ ส่งคืน $x$ มิฉะนั้นจะส่งคืน $\bot$" ดูเหมือนว่าจะตอบสนองความต้องการของคุณจากคำถาม แต่ฉันแน่ใจว่าคุณมีข้อกำหนดเพิ่มเติมที่คุณปฏิเสธที่จะระบุด้วยเหตุผลบางประการ
user10030 avatar
in flag
มันไม่ใช่การปฏิเสธ มันค่อนข้างไม่สามารถแสดงออกได้อย่างถูกต้อง ฉันจะพยายามระบุเพิ่มเติม ขอบคุณที่ช่วยเหลือจนถึงตอนนี้ หากต้องการดำเนินการต่อ: หากเราใช้ "if $x
fgrieu avatar
ng flag
แล้วแฮชที่ถูกตัดทอนล่ะ? ในกรณีการใช้งานของเรา ใช้งานได้ถึง #101 โดยมีโอกาสน้อยกว่า 1 ใน 850,000 ตรงกันข้าม
cn flag
ความพยายามที่ผิดพลาดครั้งต่อไปอย่างเห็นได้ชัดเพื่อค้นหาสิ่งที่คุณกำลังมองหา: กำหนดดัชนีตามลำดับ รักษาตัวนับ 33 บิตที่เริ่มต้นที่ศูนย์ ทุกครั้งที่คุณเห็นอินพุต ถ้า $n
user10030 avatar
in flag
@fgrieu น่าสนใจ สิ่งที่ฉันชอบเกี่ยวกับสิ่งนี้คือมันเติมเต็มพื้นที่โคโดเมน 2^32 อย่างต่อเนื่องและกระจายออกไปอย่างสม่ำเสมอ อย่างไรก็ตาม ปัญหาที่ฉันเห็นคือปัญหาที่เกิดจากฟังก์ชันแฮช: ฉันต้องการจัดเก็บยอดคงเหลืออีเทอร์ที่เกี่ยวข้องกับมัน เช่น. ฉันต้องการจะบอกว่า $n_b$ เช่น 0xabc... â $n_s$ เป็นเจ้าของ 1 อีเธอร์ อย่างไรก็ตาม เมื่อยอดคงเหลือมีขนาดใหญ่ขึ้น จนถึงจุดหนึ่ง - คล้ายกับวิธีการขุด Bitcoin - อาจกลายเป็นเรื่องประหยัดที่จะเรียกใช้อัลกอริทึมกำลังดุร้ายเช่น ค้นหาการชนกันของ $n_s$ สำหรับบัญชี $n_b$ ที่ปัจจุบันมียอดคงเหลือจำนวนมาก
user10030 avatar
in flag
เฮ้ @เมเฮอร์ เนื่องจากตัวนับที่เพิ่มขึ้นในแต่ละอินพุตและมีความจุมากกว่าจำนวน MAX ในโคโดเมน 1 บิต ปัญหาคือสำหรับหมายเลขใดๆ ในโดเมน ฉันต้องการกำหนดให้เป็นตัวเลขเดียวในโคโดเมนแม้ในการแทรกซ้ำ ฉันทำงานด้านวิทยาการคอมพิวเตอร์ ดังนั้นฉันจะเรียกฟังก์ชันดังกล่าวว่า "กำหนด" เมื่อได้รับอินพุตเฉพาะ มันจะสร้างเอาต์พุตเดียวกันเสมอ จากที่ฉันเข้าใจคือถ้าเราใช้ตัวนับที่เพิ่มขึ้น ถ้าเราใส่อินพุตเดิมซ้ำๆ กันหลายๆ ครั้ง เราจะได้ผลลัพธ์ของโคโดเมนที่แตกต่างกันในแต่ละครั้ง (เพิ่มขึ้น เช่น +1)
cn flag
คุณสามารถลองใช้แฮชแบบตัดทอนและรักษาโครงสร้างข้อมูลสมาชิกชุดโดยประมาณ (เช่น ตัวกรอง Bloom) ของดัชนีที่ใช้หมดแล้ว แต่มีแนวโน้มว่ามันจะใหญ่เกินไป
Score:2
ธง cn

สิ่งที่เกี่ยวกับ:- $$ n_s = \mathcal{H}(n_b) \& (2^{32} - 1) $$ ที่ไหน $n_b \ใน N_b$ฯลฯ? $\คณิตศาสตร์แคล{H}$ สามารถเป็นฟังก์ชันแฮชที่คุณเลือกได้ เนื่องจากนี่เป็นไซต์ crypto ฉันขอแนะนำ SHA-256 $\&$ หมายถึง AND แต่สามารถแทนที่ด้วยการเลื่อนไปทางขวาหรือซ้ายตามจำนวนบิตที่เหมาะสม (128 ในกรณีของ SHA-256) อาจจะช้าเกินไป (?)

ฟังก์ชันแฮชการเข้ารหัสคือ เสแสร้งซึ่งหมายความว่าผลลัพธ์ของพวกเขาจะชนกันในบางครั้ง อัตราการชนนั้นจะเพิ่มขึ้นอย่างมากหากคุณตัดทอน $\คณิตศาสตร์แคล{H}$ ถึง 32 บิต ยิ่งไปกว่านั้นผลของการ หลักการหลุมนกพิราบ. คุณจะได้ตั้งค่า $N_b$ เติมด้วยตัวเลขที่กระจายอย่างสม่ำเสมอให้ $n_b \ถึง n_s$ จากโดเมนถึงโคโดเมน


ฉันไม่รู้เกี่ยวกับ Ethereum แต่ 160 ดูเหมือนผลลัพธ์ของ SHA-1 อย่างน่าสงสัย หากเป็นเช่นนั้น ให้ตัดบัญชี/ที่อยู่เป็น 32 บิตเนื่องจากมีการกระจายอย่างสม่ำเสมอแล้ว

ma flag
"ฟังก์ชั่นแฮชการเข้ารหัสเป็นการคาดเดา" - ฉันไม่คิดอย่างนั้น Surjective หมายความว่าสำหรับทุกค่าแฮชที่เป็นไปได้ มีข้อความบางอย่างที่สร้างมันขึ้นมา คุณไม่สามารถพิสูจน์ได้ว่าฟังก์ชันแฮชการเข้ารหัสไม่มี "จุดบอด"
user10030 avatar
in flag
สวัสดี @paul-uszak ฉันได้แสดงความคิดเห็นในคำตอบเดิมว่าทำไมฉันถึงเชื่อว่าการตัดทอนไม่ใช่ทางออกที่ดีที่สุด เขียนถึง uint160 และ SHA-1: ใน Ethereum บัญชีจะได้รับมาจากคีย์สาธารณะ ECDSA จากนั้นแฮชโดยใช้ Keccak-256 เป็นเอาต์พุต 32 ไบต์ จากนั้น - ตัดทอนอย่างน่าประหลาดใจโดยใช้เพียง 20 ไบต์สุดท้ายเท่านั้น ในที่สุดก็นำหน้าด้วย 0x ดูเพิ่มเติม: https://ethereum.stackexchange.com/a/3619/47031
Paul Uszak avatar
cn flag
@ user10030 ดังนั้นคุณจึงมีคำตอบ :-) ตัดให้เหลือสี่ไบต์และคุณก็มีมันเหมือนในสคริปต์โพสต์ของฉัน
user10030 avatar
in flag
แม้ว่าฉันจะชื่นชมการมีอยู่ของวิธีแก้ปัญหาของคุณ แต่ฉันเชื่อว่านั่นไม่ใช่สิ่งที่ฉันต้องการในท้ายที่สุด ในกรณีที่ฉันตัดเหลือ 4 ไบต์ ฉันเริ่มให้สิ่งจูงใจแก่ผู้ใช้ในการขุดด้วยเงิน $n_b$s ซึ่งส่งผลให้ $n_s$ เท่ากัน แน่นอน สำหรับที่อยู่ $n_b$ ที่มีมูลค่าทางการเงินเพียงเล็กน้อย นี่อาจไม่ใช่ปัญหาที่แท้จริงหรือเป็นการโจมตีทางเศรษฐกิจ: แต่โดยทั่วไปแล้ว ฉันต้องการหลีกเลี่ยงปัญหาประเภทนี้ ไม่มีการชนกันหรืออาจมีการชนกัน และฉันทราบทันทีเมื่อมองย้อนกลับไปที่อินพุตและเอาต์พุตการดำเนินการแฮชอื่นๆ ทั้งหมด
Paul Uszak avatar
cn flag
@ user10030 จะมีการชนกันอย่างแน่นอนเนื่องจากหลักการของนกพิราบ ในอัตราที่ดีที่สุด $2^{-32}$ ต่อบัญชี จากนั้นจะเพิ่มขึ้นโดยไม่แสดงอาการจนถึง 1 เมื่อโคโดเมนเต็ม
Score:1
ธง ph

หากเข้าใจข้อกำหนดแล้ว สิ่งที่คุณถามไม่ใช่ "ฟังก์ชัน" ตามนิยามปกติ ดูเหมือนว่าคุณต้องการบางอย่าง $f$ ที่ให้ลำดับของอินพุต ${x_i}$ จะส่งกลับค่าที่กำหนด $y_i$ หรือสัญลักษณ์แสดงข้อผิดพลาดหากมีการส่งคืนแล้ว $y_i$. แต่สมมุติว่า $x_k$ เป็นอินพุตแรกที่ส่งคืนข้อผิดพลาด จะเกิดอะไรขึ้นถ้าคุณโทร $f$ โดยมีลำดับเริ่มจาก $x_k$? ฉันคิดว่าคุณคงต้องการให้ไม่ส่งคืนข้อผิดพลาด ดังนั้นค่าของ $ฉ(x_k)$ ไม่ได้กำหนดไว้อย่างดี

วิธีแก้ไขนั้นในทางคณิตศาสตร์คือเปลี่ยนนิยามของ $f$ เพื่อยอมรับลำดับ แต่ในทางปฏิบัติ สิ่งที่อาจหมายถึงคือการให้ระบบของคุณบันทึกอินพุตทั้งหมดที่ถูกเรียกใช้ และคุณจะพบว่าถ้าคุณทำเช่นนั้น คุณก็อาจจะกลับมาได้เช่นกัน $0, ..., n-1$ สำหรับอินพุตแรกที่แตกต่างกัน และข้อผิดพลาดสำหรับทุกอย่างที่ตามมา

user10030 avatar
in flag
ใช่ ในทางปฏิบัติแล้ว การ "รับรู้การชนกัน" อาจหมายถึงการต้องส่งลำดับไปยัง $f$ ที่จริงแล้ว การส่งผ่านลำดับจะไม่มีปัญหาตราบใดที่มันจะไม่นำไปสู่การเพิ่มพื้นที่จัดเก็บสำหรับการดำเนินการแฮชใหม่แต่ละครั้ง ฉันสงสัยว่ามีเช่น วิธีที่ค่าที่ส่งผ่านไปก่อนหน้านี้สามารถแยกตัวประกอบหรือบีบอัดเพื่อให้ไม่ใช้พื้นที่เก็บข้อมูลมากนัก และในกรณีที่สามารถส่งผ่านค่าที่ผ่านมาทั้งหมดและค่าใหม่เพื่อสร้างฟังก์ชัน "การรับรู้การชนกัน" เช่น ใน "มันส่งคืนสัญลักษณ์ข้อผิดพลาดหากพบเอาต์พุตมากกว่าครั้งแรก"

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา