1. Sanity Testing is cursory Testing and always done on tested Build while Smoke testing done always on new Build.
2. we check only major functionality in Smoke testing when we get new Build while in Sanity testing we check major functionality in depth , you can say Sanity testing is a subset of Regression Testing.
Build verification & Smoke is same for Build is stable for further testing or not.
if any difference then let me know.
Smoke testing: To be done on new build to make sure build is ready for major testing (regression). This covers testing basic functionalities of the software at high level. So this test is wide and shallow.
Sanity testing: One of the functionalities/modules is tested in depth. This test is narrow and deep.